Aplicación WeatherSG MCP: Herramientas adicionales y mapa interactivo en ChatGPT y Claude
WeatherSG, una aplicación MCP en TypeScript: contrato de datos, Streamable HTTP, despliegue en Cloud Run y registro de host para que ChatGPT y Claude muestren un mapa meteorológico en tiempo real.
Fuentes: How to Build and Deploy an MCP App
Las aplicaciones MCP amplían el Model Context Protocol más allá de las herramientas que devuelven texto: pueden entregar un recurso de interfaz de usuario interactiva que hosts como ChatGPT o Claude pueden mostrar. Esta guía muestra cómo crear WeatherSG en TypeScript: contrato de datos, obtención de información meteorológica, herramienta estándar, interfaz de mapa empaquetada como un único recurso HTML, transporte HTTP Streamable, despliegue en Cloud Run mediante contenedores y registro en ambos hosts.
Qué es una aplicación MCP
Un servidor sigue exponiendo herramientas y recursos; una aplicación, además, proporciona una interfaz front-end que el host integra después de que una llamada a herramienta la seleccione. El ciclo es: prompt → herramienta → recurso de UI → interacción del usuario → nuevas llamadas a herramientas según sea necesario.
Por qué TypeScript aquí
Un solo lenguaje para el servidor y el empaquetado de la UI mantiene pequeña la unidad de despliegue. Los tipos estrictos ayudan a que el contrato de datos sea preciso entre los normalizadores y la interfaz de mapa.
mkdir weathersg
cd weathersg
npm init -y
npm install \
@modelcontextprotocol/sdk \
@modelcontextprotocol/ext-apps \
express leaflet react react-dom zod
npm install --save-dev \
@types/express @types/leaflet @types/node \
@types/react @types/react-dom \
esbuild supertest tsx typescript vitest
Mantenga los secretos en el entorno de la plataforma; nunca incluya claves API en el HTML empaquetado.
{
"scripts": {
"build": "npm run build:web && tsc -p tsconfig.json",
"build:web": "node scripts/build-web.mjs",
"dev": "npm run build:web && tsx watch src/index.ts",
"start": "node dist/src/index.js",
"test": "vitest run",
"typecheck": "tsc -p tsconfig.json --noEmit"
},
"engines": {
"node": ">=20"
}
}
Preferir HTTP transmisible para los hosts que esperan una URL de sesión MCP duradera.
weathersg/
src/
weather/
schema.ts
client.ts
http-app.ts
index.ts
server.ts
web/
src/
main.tsx
styles.css
scripts/
build-web.mjs
tests/
Dockerfile
package.json
tsconfig.json
Las verificaciones de estado del contenedor deben dirigirse al endpoint MCP, y no solo a una página estática.
import { z } from "zod";
export const weatherLayerSchema = z.enum([
"all",
"forecast",
"rainfall",
]);
const forecastAreaSchema = z.object({
id: z.string(),
name: z.string(),
latitude: z.number(),
longitude: z.number(),
condition: z.string(),
category: z.enum([
"clear",
"cloudy",
"showers",
"thunderstorms",
"windy",
"hazy",
"unknown",
]),
});
const rainfallStationSchema = z.object({
id: z.string(),
name: z.string(),
latitude: z.number(),
longitude: z.number(),
rainfallMm: z.number().nonnegative(),
});
export const weatherSnapshotSchema = z.object({
layer: weatherLayerSchema,
generatedAt: z.string(),
forecast: z.object({
updatedAt: z.string(),
validFrom: z.string(),
validTo: z.string(),
validPeriodText: z.string(),
areas: z.array(forecastAreaSchema),
}).nullable(),
rainfall: z.object({
observedAt: z.string(),
readingType: z.string(),
unit: z.string(),
stations: z.array(rainfallStationSchema),
}).nullable(),
summary: z.object({
headline: z.string(),
areasWithRain: z.number().int().nonnegative(),
reportingRainStations: z.number().int().nonnegative(),
}),
warnings: z.array(z.string()),
sources: z.array(z.object({
label: z.string(),
url: z.string().url(),
})),
});
export type WeatherSnapshot = z.infer<typeof weatherSnapshotSchema>;
El registro del host es una configuración: vuelva a probar después de cada cambio en la URL o la autenticación.
async function fetchValidated<T>(
url: string,
schema: z.ZodType<T>,
sourceLabel: string,
): Promise<{ value: T; warning?: string }> {
const cached = cache.get(url);
try {
const response = await fetch(url, {
headers: { Accept: "application/json" },
signal: AbortSignal.timeout(8_000),
});
if (!response.ok) {
throw new Error(`Weather service returned HTTP ${response.status}`);
}
const value = schema.parse(await response.json());
cache.set(url, {
value,
expiresAt: Date.now() + 60_000,
});
return { value };
} catch (error) {
if (cached) {
return {
value: cached.value as T,
warning: `${sourceLabel} could not be refreshed`,
};
}
throw error;
}
}
Considérelo como un punto de control: las pruebas de protocolo deben superarse antes de conectar cualquier host de chat.
const [forecastResult, rainfallResult] = await Promise.allSettled([
fetchValidated(TWO_HOUR_FORECAST_URL, forecastSchema, "Forecast"),
fetchValidated(RAINFALL_URL, rainfallSchema, "Rainfall"),
]);
Mantenga los secretos en el entorno de la plataforma; nunca incluya claves API en el HTML empaquetado.
return weatherSnapshotSchema.parse(snapshot);
Preferir HTTP transmisible para los hosts que esperan una URL de sesión MCP duradera.
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { getSingaporeWeather } from "./weather/client.js";
import {
weatherLayerSchema,
weatherSnapshotSchema,
} from "./weather/schema.js";
const server = new McpServer(
{ name: "weathersg", version: "0.1.0" },
{
instructions:
"Use get_singapore_weather for factual weather questions. " +
"Use show_singapore_weather_map when the user asks to see, " +
"map, compare, or explore weather across Singapore.",
},
);
Las verificaciones de estado del contenedor deben dirigirse al endpoint MCP, y no solo a una página estática.
server.registerTool(
"get_singapore_weather",
{
title: "Get Singapore weather",
description:
"Get current official two-hour forecasts and five-minute " +
"rainfall observations across Singapore.",
inputSchema: {
layer: weatherLayerSchema.default("all"),
},
outputSchema: weatherSnapshotSchema,
annotations: {
readOnlyHint: true,
destructiveHint: false,
openWorldHint: false,
},
},
async ({ layer }) => {
const snapshot = await getSingaporeWeather(layer);
return {
structuredContent: snapshot,
content: [{
type: "text",
text: `${snapshot.summary.headline} Snapshot generated at ${snapshot.generatedAt}.`,
}],
};
},
);
El registro del host es una configuración: vuelva a probar después de cada cambio en la URL o la autenticación.
import {
registerAppResource,
registerAppTool,
RESOURCE_MIME_TYPE,
} from "@modelcontextprotocol/ext-apps/server";
export const WEATHER_APP_URI =
"ui://weathersg/singapore-weather-map/v1.html";
Considérelo como un punto de control: las pruebas de protocolo deben superarse antes de realizar cualquier conexión con el host de chat.
registerAppTool(
server,
"show_singapore_weather_map",
{
title: "Show Singapore weather map",
description:
"Show an interactive map of official forecasts and rainfall " +
"observations across Singapore.",
inputSchema: {
layer: weatherLayerSchema.default("all"),
},
outputSchema: weatherSnapshotSchema,
annotations: {
readOnlyHint: true,
destructiveHint: false,
openWorldHint: false,
},
_meta: {
ui: { resourceUri: WEATHER_APP_URI },
"openai/toolInvocation/invoking": "Reading Singapore weather…",
"openai/toolInvocation/invoked": "Singapore weather map ready",
},
},
async ({ layer }) => {
const snapshot = await getSingaporeWeather(layer);
return {
structuredContent: snapshot,
content: [{
type: "text",
text: snapshot.summary.headline,
}],
};
},
);
Mantenga los secretos en el entorno de la plataforma; nunca incluya claves API en el HTML empaquetado.
registerAppResource(
server,
"Singapore weather map",
WEATHER_APP_URI,
{ description: "Interactive map of Singapore weather" },
async () => ({
contents: [{
uri: WEATHER_APP_URI,
mimeType: RESOURCE_MIME_TYPE,
text: loadWeatherAppHtml(),
_meta: {
ui: {
prefersBorder: true,
csp: {
connectDomains: [],
resourceDomains: ["https://www.onemap.gov.sg"],
},
},
},
}],
}),
);
Preferir HTTP transmisible para aquellos hosts que esperan una URL de sesión MCP duradera.
import { App } from "@modelcontextprotocol/ext-apps";
import { createRoot } from "react-dom/client";
const app = new App(
{ name: "WeatherSG map", version: "0.1.0" },
{},
{ autoResize: true },
);
function parseSnapshot(value: unknown): WeatherSnapshot | null {
if (!value || typeof value !== "object") return null;
const candidate = value as Partial<WeatherSnapshot>;
if (!candidate.summary || !Array.isArray(candidate.sources)) return null;
if (!candidate.forecast && !candidate.rainfall) return null;
return candidate as WeatherSnapshot;
}
app.ontoolresult = (result) => {
const snapshot = parseSnapshot(result.structuredContent);
if (snapshot) deliverSnapshot(snapshot);
};
createRoot(document.getElementById("root")!).render(<WeatherApp />);
void app.connect().catch((error) => {
console.error("Unable to connect to the host", error);
});
Las verificaciones de estado del contenedor deben dirigirse al endpoint MCP, y no solo a una página estática.
await build({
entryPoints: ["web/src/main.tsx"],
bundle: true,
minify: true,
format: "esm",
platform: "browser",
write: false,
outdir: "dist/web-bundle",
});
El registro del host es parte de la configuración: vuelva a probarlo después de cualquier cambio en la URL o en los métodos de autenticación.
npm run build
Considérelo como un punto de control: las pruebas de protocolo deben superarse antes de realizar cualquier conexión con el host de chat.
import { createMcpExpressApp } from
"@modelcontextprotocol/sdk/server/express.js";
import { StreamableHTTPServerTransport } from
"@modelcontextprotocol/sdk/server/streamableHttp.js";
import { createWeatherMcpServer } from "./server.js";
const app = createMcpExpressApp();
app.post("/mcp", async (request, response) => {
response.setHeader("Cache-Control", "no-store");
const server = createWeatherMcpServer();
const transport = new StreamableHTTPServerTransport({
sessionIdGenerator: undefined,
});
await server.connect(transport);
response.on("close", () => {
void transport.close();
void server.close();
});
await transport.handleRequest(request, response, request.body);
});
Mantenga los secretos en el entorno de la plataforma; nunca incluya claves API en el HTML empaquetado.
app.get("/health", (_request, response) => {
response.json({ status: "ok", service: "weathersg" });
});
app.get("/ready", (_request, response) => {
const ready = existsSync("dist/web/weather-app.html");
response.status(ready ? 200 : 503).json({
status: ready ? "ready" : "not_ready",
});
});
Preferir HTTP transmisible para aquellos hosts que esperan una URL de sesión MCP duradera.
const port = Number(process.env.PORT ?? 3000);
const app = createWeatherHttpApp();
app.listen(port, "0.0.0.0", () => {
console.log(`WeatherSG listening on ${port}`);
});
Las verificaciones de estado del contenedor deben dirigirse al endpoint MCP, y no solo a una página estática.
npm run dev
El registro del host es una configuración: vuelva a probar después de cada cambio en la URL o en los métodos de autenticación.
npx @modelcontextprotocol/inspector@latest
Considérelo como un punto de control: las pruebas de protocolo deben superarse antes de conectar cualquier host de chat.
git clone https://github.com/modelcontextprotocol/ext-apps.git
cd ext-apps/examples/basic-host
npm install
SERVERS='["http://localhost:3000/mcp"]' npm start
Mantenga los datos confidenciales en el entorno de la plataforma; nunca incluya claves API en el HTML empaquetado.
npm run typecheck
npm test
npm run build
Prefiera HTTP con transmisión en flujo para los hosts que requieren una URL de sesión MCP estable.
FROM node:22-alpine AS build
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM node:22-alpine AS runtime
WORKDIR /app
ENV NODE_ENV=production
COPY package.json package-lock.json ./
RUN npm ci --omit=dev
COPY --from=build /app/dist ./dist
EXPOSE 3000
HEALTHCHECK --interval=30s --timeout=5s \
CMD ["node", "-e", "fetch('http://127.0.0.1:'+(process.env.PORT||3000)+'/ready').then(r=>{if(!r.ok)process.exit(1)}).catch(()=>process.exit(1))"]
CMD ["node", "dist/src/index.js"]
Las verificaciones de estado del contenedor deben dirigirse al endpoint MCP, y no solo a una página estática.
docker build -t weathersg .
docker run --rm -p 3000:3000 weathersg
El registro del host es una configuración: vuelva a probar después de cada cambio en la URL o en los métodos de autenticación.
gcloud auth login
gcloud config set project YOUR_PROJECT_ID
gcloud services enable \
run.googleapis.com \
cloudbuild.googleapis.com \
artifactregistry.googleapis.com
Considérelo como un punto de control: las pruebas de protocolo deben superarse antes de conectar cualquier host de chat.
gcloud run deploy weathersg \
--source . \
--region asia-southeast1 \
--allow-unauthenticated \
--set-env-vars PUBLISHER_NAME=WeatherSG
Mantenga los datos confidenciales en el entorno de la plataforma; nunca incluya claves API en el HTML empaquetado.
https://YOUR_SERVICE_HOST/mcp
Prefiera HTTP con transmisión en flujo para los hosts que requieren una URL de sesión MCP estable.
curl -fsS https://YOUR_SERVICE_HOST/health
curl -fsS https://YOUR_SERVICE_HOST/ready
Las verificaciones de estado del contenedor deben dirigirse al endpoint MCP, y no solo a una página estática.
Is it raining anywhere in Singapore right now?
Show me the Singapore weather map.
Now show only rainfall stations.
El registro del host es parte de la configuración: vuelva a probarlo después de cualquier cambio en la URL o en los métodos de autenticación.
https://YOUR_SERVICE_HOST/mcp
Considérelo como un punto de control: las pruebas de protocolo deben superarse antes de conectar cualquier host de chat.
Pruebas antes de la interfaz de chat
Utilice herramientas y recursos como un inspector MCP o un cliente con scripts. Los hosts de chat amplifican los fallos; tener el protocolo funcionando localmente ahorra horas de trabajo.
Despliegue y registro
Envíe el contenedor a Cloud Run (o un servicio equivalente), luego dirija los conectores de ChatGPT y Claude hacia la URL pública MCP con los encabezados de autenticación necesarios. Verifique nuevamente la interacción del mapa después de la terminación TLS.
Cierre
Una aplicación MCP es una superficie de producto que incluye el contrato, las herramientas, los recursos de interfaz, el transporte, el contenedor y la configuración del host. Si se omite algún componente, la demostración dejará de funcionar en el cliente de otra persona.
Versión de los contratos API junto a los IDs de los incrustadores.
Separar los controladores HTTP de los servicios puros para las pruebas unitarias.
Los temas de interfaz oscuro/claro no deben separar la lógica de recuperación.
Registrar los IDs de las consultas junto con las turnos de chat para su posterior triaje.
Volver a crear los índices a un ritmo acorde al cambio en las fuentes.
Rechazar cuando los segmentos principales parezcan débiles.
Versión de los contratos API junto a los IDs de los incrustadores.
Separar los controladores HTTP de los servicios puros para las pruebas unitarias.
Los temas de interfaz oscuro/claro no deben separar la lógica de recuperación.
Registrar los IDs de las consultas junto con las turnos de chat para su posterior triaje.
Volver a crear los índices a un ritmo acorde al cambio en las fuentes.
Rechazar cuando los segmentos principales parezcan débiles.
Versión de los contratos API junto a los IDs de los incrustadores.
Separar los controladores HTTP de los servicios puros para las pruebas unitarias.
Los temas de interfaz oscuro/claro no deben separar la lógica de recuperación.
Registrar los IDs de las consultas junto con las turnos de chat para su posterior triaje.
Volver a crear índices a un ritmo acorde al cambio en la fuente de datos.
Rechazar las solicitudes cuando los segmentos principales parezcan débiles.
Versionar los contratos de la API junto con los IDs de los incrustadores.
Separar los controladores HTTP de los servicios puros para pruebas unitarias.
Los temas de interfaz oscuro/claro no deben dividir la lógica de recuperación.
Registrar los IDs de las consultas junto con las turnos de chat para su posterior clasificación.
Volver a crear índices a un ritmo acorde al cambio en la fuente de datos.
Rechazar las solicitudes cuando los segmentos principales parezcan débiles.
Versionar los contratos de la API junto con los IDs de los incrustadores.
Separar los controladores HTTP de los servicios puros para pruebas unitarias.
Los temas de interfaz oscuro/claro no deben dividir la lógica de recuperación.
Registrar los IDs de las consultas junto con las turnos de chat para su posterior clasificación.
Volver a crear índices a un ritmo acorde al cambio en la fuente de datos.
Rechazar las solicitudes cuando los segmentos principales parezcan débiles.
Versionar los contratos de la API junto con los IDs de los incrustadores.
Separar los controladores HTTP de los servicios puros para pruebas unitarias.
Los temas de interfaz oscuro/claro no deben separar la lógica de recuperación.
Registre los IDs de las consultas junto con las turnos de chat para su posterior clasificación.
Vuelva a crear los índices a un ritmo acorde al cambio en las fuentes.
Rechace las solicitudes cuando los segmentos principales parezcan débiles.
Versione los contratos de la API junto con los IDs de los incrustadores.
Separe los controladores HTTP de los servicios puros para pruebas unitarias.
Los temas de interfaz oscuro/claro no deben separar la lógica de recuperación.
Registre los IDs de las consultas junto con las turnos de chat para su posterior clasificación.
Vuelva a crear los índices a un ritmo acorde al cambio en las fuentes.
Rechace las solicitudes cuando los segmentos principales parezcan débiles.
Versione los contratos de la API junto con los IDs de los incrustadores.
Separe los controladores HTTP de los servicios puros para pruebas unitarias.
Los temas de interfaz oscuro/claro no deben separar la lógica de recuperación.
Registre los IDs de las consultas junto con las turnos de chat para su posterior clasificación.
Vuelva a crear los índices a un ritmo acorde al cambio en las fuentes.
Rechace las solicitudes cuando los segmentos principales parezcan débiles.
Versión de los contratos API junto a los IDs de los incrustadores.
Separar los controladores HTTP de los servicios puros para las pruebas unitarias.
Los temas de interfaz oscuro/claro no deben dividir la lógica de recuperación.
Registrar los IDs de las consultas junto con las turnos de chat para su posterior triaje.
Volver a crear los índices a un ritmo acorde al cambio en las fuentes.
Rechazar cuando los segmentos principales parezcan débiles.
Versión de los contratos API junto a los IDs de los incrustadores.
Separar los controladores HTTP de los servicios puros para las pruebas unitarias.
Los temas de interfaz oscuro/claro no deben dividir la lógica de recuperación.
Registrar los IDs de las consultas junto con las turnos de chat para su posterior triaje.
Volver a crear los índices a un ritmo acorde al cambio en las fuentes.
Rechazar cuando los segmentos principales parezcan débiles.
Versión de los contratos API junto a los IDs de los incrustadores.
Separar los controladores HTTP de los servicios puros para las pruebas unitarias.
Los temas de interfaz oscuro/claro no deben dividir la lógica de recuperación.
Registrar los IDs de las consultas junto con las turnos de chat para su posterior triaje.
Volver a crear índices a un ritmo acorde al cambio en la fuente de datos.
Rechazar las solicitudes cuando los segmentos principales parezcan débiles.
Versionar los contratos de la API junto con los IDs de los incrustadores.
Separar los controladores HTTP de los servicios puros para pruebas unitarias.
Los temas de interfaz oscuro/claro no deben dividir la lógica de recuperación.
Registrar los IDs de las consultas junto con las turnos de chat para su posterior clasificación.
Volver a crear índices a un ritmo acorde al cambio en la fuente de datos.
Rechazar las solicitudes cuando los segmentos principales parezcan débiles.
Versionar los contratos de la API junto con los IDs de los incrustadores.
Separar los controladores HTTP de los servicios puros para pruebas unitarias.
Los temas de interfaz oscuro/claro no deben dividir la lógica de recuperación.
Registrar los IDs de las consultas junto con las turnos de chat para su posterior clasificación.
Volver a crear índices a un ritmo acorde al cambio en la fuente de datos.
Rechazar las solicitudes cuando los segmentos principales parezcan débiles.
Versionar los contratos de la API junto con los IDs de los incrustadores.
Separar los controladores HTTP de los servicios puros para pruebas unitarias.
Los temas de interfaz oscura/clara no deben modificar la lógica de recuperación.
Registre los IDs de las consultas de registros junto con las turnos de chat para su posterior clasificación.
Vuelva a crear los índices con una frecuencia acorde al cambio constante en la fuente de datos.
Rechace las solicitudes cuando los segmentos principales parezcan débiles.
Mantenga las configuraciones fijas, los responsables y las notas de reversión junto a los cambios realizados en la integración y el despliegue.
Mantenga las configuraciones fijas, los responsables y las notas de reversión junto a los cambios realizados en la integración y el despliegue.
Mantenga las configuraciones fijas, los responsables y las notas de reversión junto a los cambios realizados en la integración y el despliegue.
Mantenga las configuraciones fijas, los responsables y las notas de reversión junto a los cambios realizados en la integración y el despliegue.
Mantenga las configuraciones fijas, los responsables y las notas de reversión junto a los cambios realizados en la integración y el despliegue.
Mantenga las configuraciones fijas, los responsables y las notas de reversión junto a los cambios realizados en la integración y el despliegue.
Mantenga las configuraciones fijas, los responsables y las notas de reversión junto a los cambios realizados en la integración y el despliegue.
Mantenga las configuraciones fijas, los responsables y las notas de reversión junto a los cambios realizados en la integración y el despliegue.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los datos de referencia, los responsables y las notas de reversión junto a los cambios de incorporación e implementación.
Mantenga los componentes, propietarios y notas de reversión junto con las modificaciones realizadas en la integración y despliegue.
Lecturas relacionadas
- Habilidades más MCP: las herramientas brindan recursos prácticos, las habilidades enseñan el flujo de trabajo — MCP expone las capacidades; el paquete Skills organiza los flujos de trabajo y establece límites para que los agentes sepan qué herramientas usar, en qué orden y cuándo solicitar aprobación.
- ¿Qué es MCP? Conectando aplicaciones de IA a herramientas y datos — Conceptos básicos del Model Context Protocol: hosts, clientes, servidores, descubrimiento de herramientas, ejemplo con Neo4j, flujos de trabajo basados en agentes y límites de seguridad.