index.ts•3.53 kB
import { z } from "zod";
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { getBrasilApiData, formatErrorResponse } from "../../utils/api.js";
/**
* Register IBGE related tools to the MCP server
* @param server MCP Server instance
*/
export function registerIbgeTools(server: McpServer) {
// Tool to list all Brazilian states
server.tool(
"ibge-states-list",
"List all Brazilian states with their information",
{},
async () => {
console.error("Listing all Brazilian states");
const result = await getBrasilApiData(`/ibge/uf/v1`);
if (!result.success) {
return formatErrorResponse(`Error listing states: ${result.message}`);
}
// Format the response data
const states = result.data;
const formattedStates = states.map((state: any) =>
`${state.sigla} - ${state.nome} (Region: ${state.regiao.nome})`
).join("\n");
return {
content: [{
type: "text" as const,
text: `Brazilian States:\n${formattedStates}`
}]
};
}
);
// Tool to find state by code or abbreviation
server.tool(
"ibge-state-search",
"Find information about a Brazilian state by its code or abbreviation",
{
code: z.string()
.describe("State code or abbreviation (e.g., SP, RJ, 35)")
},
async ({ code }) => {
console.error(`Finding state by code/abbreviation: ${code}`);
const result = await getBrasilApiData(`/ibge/uf/v1/${code}`);
if (!result.success) {
return formatErrorResponse(`Error finding state: ${result.message}`);
}
// Format the response data
const state = result.data;
return {
content: [{
type: "text" as const,
text: `
State Information:
Name: ${state.nome}
Abbreviation: ${state.sigla}
Region: ${state.regiao.nome}
ID: ${state.id}
`
}]
};
}
);
// Tool to list municipalities of a state
server.tool(
"ibge-municipalities-list",
"List all municipalities of a Brazilian state by its abbreviation",
{
uf: z.string()
.describe("State abbreviation (e.g., SP, RJ)")
},
async ({ uf }) => {
console.error(`Listing municipalities for state: ${uf}`);
const result = await getBrasilApiData(`/ibge/municipios/v1/${uf}`);
if (!result.success) {
return formatErrorResponse(`Error listing municipalities: ${result.message}`);
}
// Format the response data
const municipalities = result.data;
// If there are too many municipalities, limit the display
let formattedText;
if (municipalities.length > 50) {
const first30 = municipalities.slice(0, 30).map((municipality: any) =>
`${municipality.nome} (Code: ${municipality.codigo_ibge})`
).join("\n");
formattedText = `Municipalities in ${uf} (showing first 30 of ${municipalities.length}):\n${first30}\n\n...and ${municipalities.length - 30} more municipalities.`;
} else {
const formattedMunicipalities = municipalities.map((municipality: any) =>
`${municipality.nome} (Code: ${municipality.codigo_ibge})`
).join("\n");
formattedText = `Municipalities in ${uf}:\n${formattedMunicipalities}`;
}
return {
content: [{
type: "text" as const,
text: formattedText
}]
};
}
);
}