Unified MCP & A2A Server
Un servidor de Google Apps Script que unifica el Protocolo de Contexto de Modelo (MCP) y Agent2Agent (A2A) para usuarios de Google Workspace.
Documentación
Consolidando Protocolos de IA Generativa: Una Solución de Servidor Único para MCP y A2A

Resumen
Un nuevo Google Apps Script unificado ahora implementa tanto la red del Protocolo de Contexto de Modelo (MCP) como la de Agente a Agente (A2A) como un solo servidor, optimizando la integración de modelos de IA para usuarios de Google Workspace.
Introducción
El rápido crecimiento de la IA generativa ha llevado a una integración cada vez mayor entre los modelos de IA, ejemplificada por protocolos como el Protocolo de Contexto de Modelo (MCP) y el Protocolo Agente a Agente (A2A). Recientemente, publiqué MCPApp y A2AApp, que establecen las redes MCP y A2A usando Google Apps Script. Ref y Ref Este enfoque ofrece ventajas significativas para los usuarios de Google Workspace y las APIs de Google, ya que permite una autorización e integración sin problemas de estos recursos directamente dentro de las aplicaciones.
Tradicionalmente, implementar servidores MCP y A2A separados requería configurar y desarrollar dos proyectos distintos. Este informe aborda esa ineficiencia presentando un script unificado capaz de crear tanto los servidores MCP como A2A como un único servidor integrado. Esta consolidación permite que tanto los clientes MCP como A2A accedan a un servidor común, agilizando las operaciones. Además, facilita el intercambio de funciones comunes entre los servidores MCP y A2A, reduciendo significativamente los costos de desarrollo y mejorando la eficiencia general.
Flujo
El diagrama de flujo de esto es el siguiente.
flowchart TD
subgraph Server
direction TB
functions[Functions] --> mvp[MCP server] & a2a[A2A server]
end
A[MCP Client] -- Protocol for MCP --> Server
B[A2A Client] -- Protocol for A2A --> Server
Repositorio
Uso
1. Obtener clave de API
Para usar los scripts de este informe, utilice su clave de API. Ref Esta clave de API se usa para acceder a la API de Gemini.
2. Copiar el script de demostración
Puede copiar el script de demostración usando el siguiente Google Apps Script. Copie y pegue el siguiente script en el editor de scripts de Google Apps Script y ejecute la función myFunction. Con esto, el proyecto de demostración de Google Apps Script se copia a la carpeta raíz de su Google Drive.
function myFunction() {
const fileId = "1N1eg3vEgi_eVAiPB1SrPG9NIfEEQ5qohZED9haQQ7VbOKnMfLkPkYkUe";
const file = DriveApp.getFileById(fileId);
file.makeCopy(file.getName());
}
Por supuesto, también puede copiar y pegar directamente el script desde el repositorio. GitHub
3. Implementar Web Apps
Para permitir el acceso desde los clientes MCP y A2A, el proyecto usa Web Apps creadas con Google Apps Script como servidor. Ambos clientes pueden acceder a este servidor usando solicitudes HTTP GET y HTTP POST. Así, las Web Apps pueden servir como un servidor unificado, integrando las funcionalidades MCP y A2A.
Puede encontrar información detallada en la documentación oficial.
Siga estos pasos para implementar la Web App en el editor de scripts.
- En el editor de scripts, en la parte superior derecha, haga clic en "Implementar" -> "Nueva implementación".
- Haga clic en "Seleccionar tipo" -> "Web App".
- Ingrese la información sobre la Web App en los campos bajo "Configuración de implementación".
- Seleccione "Yo" para "Ejecutar como".
- Seleccione "Cualquier persona" para "Quién tiene acceso a la app:".
- Haga clic en "Implementar".
- En el editor de scripts, en la parte superior derecha, haga clic en "Implementar" -> "Implementaciones de prueba".
- Copie la URL de la Web App. Será similar a
https://script.google.com/macros/s/###/exec. Esta URL se usa para el cliente MCP y el servidor A2A. - Ejecute la función
getRegisteringAgentCardURL()en el script copiado y copie la URL que se muestra en la consola. Esta URL se usa para el cliente A2A.
Es importante tener en cuenta que cuando modifique el Google Apps Script para la Web App, debe modificar la implementación como una nueva versión. Esto asegura que el script modificado se refleje en la Web App. Tenga cuidado con esto. Además, puede encontrar más detalles en mi informe "Redeploying Web Apps without Changing URL of Web Apps for new IDE".
4. Actualizar el script copiado
Cuando haya copiado el archivo, ábralo. Se abrirá el editor de scripts. Realice las siguientes modificaciones.
- Establezca su clave de API en
apiKey. - Establezca la URL de Web Apps como
https://script.google.com/macros/s/###/execen la URL deagentCard. At that time, please add a query parameter ofaccessKey=sample. So, the URL becomeshttps://script.google.com/macros/s/###/exec?accessKey=sample
5. Pruebas
Cliente MCP
Como cliente MCP, se usa Claude Desktop. Ref En este caso, el claude_desktop_config.json se configura de la siguiente manera. Reemplace https://script.google.com/macros/s/###/exec con la URL de su Web App.
{
"mcpServers": {
"gas_web_apps": {
"command": "npx",
"args": [
"mcp-remote",
"https://script.google.com/macros/s/###/exec?accessKey=sample"
]
}
}
}
Cierre y abra Claude Desktop nuevamente. El resultado se puede ver en la siguiente demostración.

Puede ver que el cliente MCP de Claude Desktop puede usar el servidor que integra el servidor MCP y el servidor A2A creado por Google Apps Script.
Cliente A2A
Como cliente A2A, se usa @a2a-js/sdk. Ref En este caso, para probar el script usando @a2a-js/sdk, es necesario modificar @a2a-js/sdk. Modifique la función _fetchAndCacheAgentCard de node_modules/@a2a-js/sdk/build/src/client/client.js de la siguiente manera.
Para solicitar Web Apps de Google Apps Script con la ruta /.well-known/agent.json, se requiere un token de acceso Ref. Este token de acceso se usa como parámetro de consulta. Sin embargo, la mayoría de las especificaciones actuales de clientes A2A no lo admiten. Por lo tanto, es necesaria la siguiente modificación.
Además, solicitar Web Apps requiere una redirección Ref. Desafortunadamente, el cliente A2A público para Python no admite redirecciones. En contraste, Node.js admite redirecciones por defecto. Por estas razones, se eligió @a2a-js/sdk como muestra para este informe.
De
const agentCardUrl = `${this.agentBaseUrl}/.well-known/agent.json`;
A
const agentCardUrl = ((agentBaseUrl) => {
/**
* ### Description
* This method is used for parsing the URL including the query parameters.
* Ref: https://tanaikech.github.io/2018/07/12/adding-query-parameters-to-url-using-google-apps-script/
*
* @param {String} url The URL including the query parameters.
* @return {Object} JSON object including the base url and the query parameters.
*/
function parseQueryParameters(url) {
if (url === null || typeof url != "string") {
throw new Error(
"Please give URL (String) including the query parameters."
);
}
const s = url.split("?");
if (s.length == 1) {
return { url: s[0], queryParameters: null };
}
const [baseUrl, query] = s;
if (query) {
const queryParameters = query.split("&").reduce(function (o, e) {
const temp = e.split("=");
const key = temp[0].trim();
let value = temp[1].trim();
value = isNaN(value) ? value : Number(value);
if (o[key]) {
o[key].push(value);
} else {
o[key] = [value];
}
return o;
}, {});
return { url: baseUrl, queryParameters };
}
return null;
}
/**
* ### Description
* This method is used for adding the query parameters to the URL.
* Ref: https://tanaikech.github.io/2018/07/12/adding-query-parameters-to-url-using-google-apps-script/
*
* @param {String} url The base URL for adding the query parameters.
* @param {Object} obj JSON object including query parameters.
* @return {String} URL including the query parameters.
*/
function addQueryParameters(url, obj) {
if (url === null || obj === null || typeof url != "string") {
throw new Error(
"Please give URL (String) and query parameter (JSON object)."
);
}
const o = Object.entries(obj);
return (
(url == "" ? "" : `${url}${o.length > 0 ? "?" : ""}`) +
o
.flatMap(([k, v]) =>
Array.isArray(v)
? v.map((e) => `${k}=${encodeURIComponent(e)}`)
: `${k}=${encodeURIComponent(v)}`
)
.join("&")
);
}
const urlObj = parseQueryParameters(agentBaseUrl);
return addQueryParameters(
`${urlObj.url}/.well-known/agent.json`,
urlObj.queryParameters
);
})(this.agentBaseUrl);
El script de muestra del cliente A2A es el siguiente. Reemplace https://script.google.com/macros/s/###/dev?access_token=###&accessKey=sample con su URL obtenida por la función getRegisteringAgentCardURL() en el script copiado.
import {
A2AClient,
Message,
MessageSendParams,
SendMessageResponse,
SendMessageSuccessResponse,
} from "@a2a-js/sdk";
import { v4 as uuidv4 } from "uuid";
// Please set your A2A server URL.
const agentBaseUrl = "https://script.google.com/macros/s/###/dev?access_token=###&accessKey=sample";
// Sample prompts for testing the above A2A server.
const prompts = [
"How much is 10 yen in USD?",
"What is the weather forecast for Tokyo at noon today?",
];
async function run(prompts: Array<string>) {
const client = new A2AClient(agentBaseUrl);
for (let prompt of prompts) {
const messageId = uuidv4();
const sendParams: MessageSendParams = {
message: {
messageId: messageId,
role: "user",
parts: [{ kind: "text", text: prompt }],
kind: "message",
},
configuration: {
blocking: true,
acceptedOutputModes: ["text/plain"],
},
};
const sendResponse: SendMessageResponse = await client.sendMessage(
sendParams
);
const result = (sendResponse as SendMessageSuccessResponse).result;
const messageResult = result as Message;
messageResult.parts.forEach((e) => {
if (e.kind == "text") {
console.log(`Prompt: ${prompt}`);
console.log(`Response: ${e.text}`);
}
});
}
}
run(prompts);
Cuando se ejecuta este script, se puede obtener el siguiente resultado.

Puede ver que el cliente A2A creado por @a2a-js/sdk puede usar el servidor que integra el servidor MCP y el servidor A2A creado por Google Apps Script.
IMPORTANTE
- Si ocurre un error, vuelva a implementar las Web Apps para reflejar el script más reciente. Es importante tener en cuenta que cuando modifique el Google Apps Script para la Web App, debe modificar la implementación como una nueva versión. Esto asegura que el script modificado se refleje en la Web App. Tenga cuidado con esto. Además, puede encontrar más detalles en mi informe "Redeploying Web Apps without Changing URL of Web Apps for new IDE".
Resumen
- Se desarrolló un nuevo Google Apps Script unificado para implementar tanto la red del Protocolo de Contexto de Modelo (MCP) como la de Agente a Agente (A2A) como un solo servidor.
- Este enfoque consolidado abordó la ineficiencia de las implementaciones tradicionales, que requerían proyectos separados para los servidores MCP y A2A.
- El servidor unificado permitió que tanto los clientes MCP como A2A accedieran a un servidor común, lo que agilizó las operaciones y facilitó el intercambio de funciones comunes, reduciendo así los costos de desarrollo.
- El servidor utilizó Web Apps creadas con Google Apps Script para manejar solicitudes HTTP GET y HTTP POST de los clientes MCP y A2A.
- Las demostraciones usando Claude Desktop como cliente MCP y
@a2a-js/sdkcomo cliente A2A mostraron con éxito que el servidor integrado de Google Apps Script funcionaba correctamente para ambos protocolos.
Licencia
Autor
Historial de actualizaciones
-
v1.0.0 (19 de junio de 2025)
- Lanzamiento inicial.