Another week flies by. At the moment I’m working on one platform which is a very thin layer that interacts with data sources and LLMs. This week I got it to a very solid state and was able to do some preliminary demos as we are now going to start applying it to some real world scenarios.
Ultimately, all IT stuff is basically IPO – input process output … back in the 90s when you are doing computer science lessons, it’s the fundamental thing that makes software valuable to people. People put information in, the system does something, and it outputs something of value to that person. That value is then monetised.
LLMs have actually changed the whole IPO paradigm – the inputs are now completely different – you can talk in natural language and through LLMs it can somewhat guess intent correctly (even without ‘intelligence’, the prediction is good enough) …some of the processing can be done via MCP and finally, and now the output UI can be voice, or it can be a UI generated on the fly.
I expect LLMs to become more optimised to the point where the bigger devices like MacBook Pros have them running locally, so you really can have more privacy when using ChatGPT-esque UIs … once we’ve got local LLMs running and you can plug into them how you want, I think that’s going to be really interesting from a creation point of view.
All fun and games.
OpenAI structured output
Whilst I haven’t played with the other LLM APIs yet, the thing I really like about the responses API is the structured output where you can enforce a response in a specific format. So if you want information back as an article, or a car, or an animal, or whatever, you can enforce the attributes that you want.
MCP Stuff – Tool discovery
After initiating a connection, it’s really easy to request what tools are available:
{ "jsonrpc": "2.0", "id": 2, "method": "tools/list" }
Unsure entirely what the ID corresponds to at the point, but I’ll figure it out.
The server will respond with something like
{
"jsonrpc": "2.0",
"id": 2,
"result": {
"tools": [
{
"name": "calculator_arithmetic",
"title": "Calculator",
"description": "Perform mathematical calculations including basic arithmetic, trigonometric functions, and algebraic operations",
"inputSchema": {
"type": "object",
"properties": {
"expression": {
"type": "string",
"description": "Mathematical expression to evaluate (e.g., '2 + 3 * 4', 'sin(30)', 'sqrt(16)')"
}
},
"required": ["expression"]
}
},
{
"name": "weather_current",
"title": "Weather Information",
"description": "Get current weather information for any location worldwide",
"inputSchema": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "City name, address, or coordinates (latitude,longitude)"
},
"units": {
"type": "string",
"enum": ["metric", "imperial", "kelvin"],
"description": "Temperature units to use in response",
"default": "metric"
}
},
"required": ["location"]
}
}
]
}
}
The server responds with a list of available tools, and as you can see it describes how you are meant to respond if you want to use those tools. So name, title, description are fairly straightforward … inputSchema describes the inputs and data types needed.
The OpenAI docs recommend that you do a ‘tool discovery’ routine that cycles through all MCP servers that it’s connected to, and then put them in a tool registry. The LLM can then understand what it has access to.