upAPI

Todas as operações públicas da upAPI como ferramentas MCP: busca na web, Google Maps, capturas de tela, PDF, OCR e mais.

Documentação

@upapi/mcp

Toda operação pública da upAPI como uma ferramenta MCP — busca na web, SERP, perfis sociais, consultas de ferramentas de desenvolvimento, dados geográficos/financeiros — para que um agente possa chamá-las diretamente.

Existem duas formas de conectar, e elas diferem apenas em como uma chamada é autenticada:

Local (stdio)Hospedado (HTTP)
Endpointnpx @upapi/mcphttps://app.upapi.io/api/mcp
Authsua chave de API upapi_entre com sua conta upAPI (OAuth)
Execuçãona sua máquinana upAPI
Melhor parascripts, CI, agentes auto-hospedadosClaude, IDEs, qualquer coisa que fale MCP remoto

Ambos expõem as mesmas ferramentas com os mesmos esquemas, e ambos cobram da mesma cota.

Hospedado — sem instalação

Aponte qualquer cliente MCP que suporte servidores remotos para:

https://app.upapi.io/api/mcp

Ele vai guiá-lo pelo login na upAPI em um navegador; não há chave para copiar. Com o Claude Code:

claude mcp add --transport http upapi https://app.upapi.io/api/mcp

Local — chave de API

Crie uma chave em app.upapi.io → API Keys, depois:

claude mcp add upapi -e UPAPI_API_KEY=upapi_xxx -- npx -y @upapi/mcp

Claude Desktop (claude_desktop_config.json), Cursor e Windsurf aceitam o mesmo em JSON:

{
  "mcpServers": {
    "upapi": {
      "command": "npx",
      "args": ["-y", "@upapi/mcp"],
      "env": { "UPAPI_API_KEY": "upapi_xxx" }
    }
  }
}
Variável
UPAPI_API_KEYobrigatóriauma chave upapi_
UPAPI_BASE_URLopcionalorigem do gateway, padrão é https://api.upapi.io

A chave nunca é validada localmente — apenas verificada quanto à presença, então uma chave ausente falha imediatamente com uma mensagem legível em vez de aparecer mais tarde como um 401 inexplicável dentro de uma chamada de ferramenta. Se uma chave é real, expirada ou acima da cota é respondido no gateway, o único lugar que responde isso para cada chamador de máquina.

Ferramentas

O endpoint hospedado serve uma tabela compacta por padrão: duas meta-ferramentas mais algumas operações sempre ativas, alguns kilobytes no total.

FerramentaO que faz
search_opsEncontra operações por intenção — retorna slug, descrição, parâmetros e custo de cota
call_opExecuta uma operação por slug: { "slug": "github-repo.get", "input": { … } }

Uma tabela de ferramentas é reenviada como contexto a cada turno, então uma ferramenta por operação significa dezenas de kilobytes de JSON Schema por turno e uma tabela grande o suficiente para degradar de forma mensurável a seleção de ferramentas. search_ops + call_op permanece estável conforme o catálogo cresce. web-search.post, github-repo.get, e wikipedia-article.get permanecem na tabela como ferramentas completas para que o caso comum não precise de uma viagem de descoberta.

Quer cada operação como sua própria ferramenta? Adicione ?tools=full:

claude mcp add --transport http upapi 'https://app.upapi.io/api/mcp?tools=full'

Ambos os modos alcançam exatamente as mesmas operações — o modo muda o que é anunciado, nunca o que é permitido. As operações são nomeadas conforme seu slug com . e - substituídos por _ (web-search.postweb_search_post), e cada uma anuncia o JSON Schema real da operação (formatos, limites, padrões, anulabilidade), porque esse esquema é gerado a partir do modelo do próprio worker e passado sem alterações.

O servidor local (stdio) sempre serve uma ferramenta por operação, e o catálogo inteiro: ele é instalado deliberadamente, com sua própria chave, em um cliente de sua escolha.

As descrições carregam o custo de cota, para que um agente possa fazer orçamento:

Busca na web… operação upAPI web-search.post (Search). Custa 25 unidades da cota mensal por chamada.

Uma operação com falha retorna como um resultado normal de ferramenta com isError: true e texto começando com o código de erro público da upAPI — RATE_LIMITED, INVALID_INPUT, UPSTREAM_UNREACHABLE. Um limite de taxa também informa o tempo de espera em segundos. Nada sobre uma operação com falha quebra a sessão.

Nenhum outputSchema é declarado, deliberadamente: MCP exige que um servidor que declare um retorne structuredContent correspondentes, e essas saídas descrevem payloads ao vivo de terceiros. Um null inesperado transformaria uma chamada bem-sucedida em um erro de protocolo.

Use com Mastra

As ferramentas funcionam diretamente em um agente Mastra, sem um transporte MCP no meio:

import { Agent } from '@mastra/core/agent';
import { createGatewayCaller, createUpapiTools } from '@upapi/mcp';

const agent = new Agent({
  name: 'researcher',
  instructions: 'Research topics using upAPI.',
  model: /* … */,
  tools: createUpapiTools({
    caller: createGatewayCaller({ apiKey: process.env.UPAPI_API_KEY! }),
  }),
});

Reduza a tabela com filter quando um agente deve ver apenas parte do catálogo:

createUpapiTools({
  caller,
  filter: (op) => op.category === 'Search',
});

Construa seu próprio servidor

caller é a única coisa que a tabela de ferramentas não fornece, o que permite que as mesmas ferramentas rodem em diferentes transportes:

import { createUpapiMcpServer, type Caller } from '@upapi/mcp';

const caller: Caller = async (slug, input) => {
  // resolve with the operation's output, or throw
  // { code, message, status?, retryAfterSeconds? }
};

await createUpapiMcpServer({ caller }).startStdio();

Para um servidor Request/Response padrão da web (rota Next.js, Worker, Hono), importe o handler do subcaminho /http — é assim que app.upapi.io/api/mcp é construído:

import { handleUpapiMcpRequest, type Caller } from '@upapi/mcp/http';

await handleUpapiMcpRequest(request, {
  caller,
  // mode defaults to the request's own `?tools=` parameter (compact unless `full`)
  canExecute: true, // false hides every executable tool and refuses a call to one
  canSearch: true, // false hides `search_ops`
});

canExecute / canSearch são como um host projeta sua própria autorização na tabela — a upAPI os mapeia para os escopos ops:execute e ops:read do token de acesso. Ambos padrão como true, então um host sem modelo de escopo não é afetado.

Prefira esse subcaminho em vez da raiz do pacote em uma implantação empacotada ou com rastreamento de arquivos. A entrada raiz reexporta os bindings do Mastra, então importar o handler dela puxa @mastra/core e @mastra/mcp para um build que nunca executa um agente Mastra; @upapi/mcp/http alcança apenas o SDK MCP.

Relacionados

  • @upapi/sdk — o cliente HTTP tipado, e o catálogo de operações do qual a tabela de ferramentas deste pacote é gerada
  • upapi.io/docs — referência de operações

Onde o desenvolvimento acontece

Este repositório é o lar publicado de @upapi/mcp: é o que o npm instala, e issues e pull requests são bem-vindos aqui. A tabela de ferramentas é derivada do catálogo de operações em @upapi/sdk, que por sua vez é gerado a partir das definições privadas de operações da upAPI e sincronizado automaticamente — então o conjunto de ferramentas muda a montante. O servidor, a fachada, o mapeamento de erros e os testes nesses arquivos são escritos à mão e são o código a ser alterado.