Skip to main content
Glama
santapau10

cantkeepupwithai-mcp

by santapau10

cantkeepupwithai-mcp

Prototipo de servidor MCP (Model Context Protocol) que expone los datos de cantkeepupwithai.com — trends de IA, digest diario, toolbox y stats del pipeline — a asistentes compatibles con MCP como Claude Desktop.

Es un cliente delgado: cada herramienta hace una petición HTTP al backend real (cantkeepupwithai/backend, Express + Prisma) corriendo en local, y devuelve la respuesta tal cual como JSON.

Herramientas expuestas

Herramienta

Descripción

Endpoint del backend

get_trending_topics

Lista los trends de IA rankeados por menciones (últimos 30 días), con sparkline de 7 días. Filtro opcional por tag.

GET /api/trends

get_trend_detail

Detalle completo de un trend por id: resumen, por qué importa, historial y referencias/fuentes.

GET /api/trends/:id

get_daily_digest

El digest diario de noticias de IA. Sin date devuelve el último publicado; con date (YYYY-MM-DD) devuelve el de ese día.

GET /api/digests/latest o GET /api/digests/:date

list_digest_archive

Lista paginada de digests pasados (fecha, número de issue, cantidad de historias).

GET /api/digests

search_toolbox

Búsqueda de texto completo sobre trends, historias del digest y el toolbox de herramientas de IA.

GET /api/search

get_pipeline_stats

Stats de la última corrida del pipeline de ingesta (fuentes revisadas, posts leídos, etc).

GET /api/pipeline/stats

Related MCP server: toad-mcp-server

Requisitos

  • Node.js 20+

  • El backend de cantkeepupwithai corriendo en local (por defecto en http://localhost:4000), con su base de datos accesible. Ver cantkeepupwithai/backend/README.md para levantarlo.

Instalación y build

cd cantkeepupwithai-mcp
npm install
npm run build

Esto compila src/ a dist/index.js, que es el entrypoint del servidor MCP (transporte stdio).

Probarlo suelto (sin Claude Desktop)

Con el backend corriendo en localhost:4000, podés levantar el servidor y hablarle por stdio con el MCP Inspector:

npx @modelcontextprotocol/inspector node dist/index.js

Eso abre una UI en el navegador donde podés listar las herramientas y ejecutarlas contra datos reales.

Configurarlo en Claude Desktop

Editá el archivo de configuración de Claude Desktop:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

  • Windows: %APPDATA%\Claude\claude_desktop_config.json

Y agregá una entrada en mcpServers (ajustá la ruta absoluta a donde clonaste este repo):

{
  "mcpServers": {
    "cantkeepupwithai": {
      "command": "node",
      "args": [
        "/Users/pablolarraz/Desktop/dev/ckuwai/cantkeepupwithai-mcp/dist/index.js"
      ],
      "env": {
        "CKUWAI_API_BASE_URL": "http://localhost:4000"
      }
    }
  }
}

Reiniciá Claude Desktop. El servidor debería aparecer con el ícono de herramientas (🔨), y podés pedirle cosas como "¿qué trends de IA están subiendo esta semana según cantkeepupwithai?" o "dame el digest de hoy de cantkeepupwithai".

Importante: el backend de cantkeepupwithai debe estar corriendo en local (npm run dev dentro de cantkeepupwithai/backend) para que las herramientas devuelvan datos — este servidor MCP no incluye lógica de negocio propia, solo reenvía las peticiones.

Variables de entorno

Variable

Default

Descripción

CKUWAI_API_BASE_URL

http://localhost:4000

URL base del backend contra la que se hacen las peticiones.

MCP_AUTH_TOKEN

Solo lo usa api/mcp.ts (despliegue remoto). Token que el cliente debe mandar como Authorization: Bearer <token>. Sin transporte stdio no aplica.

Despliegue remoto (Vercel)

Además del transporte stdio para uso local, el repo incluye api/mcp.ts: el mismo servidor MCP expuesto por Streamable HTTP (el transporte estándar de MCP para servidores remotos), como función serverless de Vercel. Está desplegado en:

https://cantkeepupwithai-mcp.vercel.app/api/mcp

apuntando al backend de producción real (https://cantkeepupwithai-backend.vercel.app).

Cada request HTTP crea una instancia nueva y sin estado del servidor MCP (sessionIdGenerator: undefined) — apropiado para funciones serverless, que no garantizan que dos requests caigan en el mismo proceso.

Autenticación: el endpoint exige Authorization: Bearer <MCP_AUTH_TOKEN> en cada request; sin el header (o con un token incorrecto) devuelve 401. El valor real del token vive como variable de entorno en el proyecto de Vercel (vercel env ls), no está en este repo.

Para conectar un cliente MCP remoto (ej. Claude Desktop con soporte de conectores HTTP, o cualquier cliente MCP que hable Streamable HTTP):

{
  "mcpServers": {
    "cantkeepupwithai-remote": {
      "url": "https://cantkeepupwithai-mcp.vercel.app/api/mcp",
      "headers": {
        "Authorization": "Bearer <MCP_AUTH_TOKEN>"
      }
    }
  }
}

Para redesplegar cambios:

npx vercel --prod

Próximos pasos para una versión remota más madura

  • El token compartido actual es suficiente para un prototipo de un solo usuario, pero no escala a múltiples usuarios/organizaciones — la spec de MCP recomienda OAuth 2.1 para servidores remotos multi-tenant.

  • No hay rate limiting propio en el servidor MCP (más allá del que ya tiene el backend real por IP) — un token filtrado podría generar tráfico excesivo contra el backend de producción.

  • Solo se exponen operaciones de lectura. El backend también tiene endpoints de escritura (votar/reportar herramientas del toolbox, crear herramientas desde un repo, suscribirse al newsletter) que deliberadamente no se expusieron en este prototipo — habría que decidir caso por caso si tiene sentido darle a un asistente IA la capacidad de escribir datos.

Available Tools

6 tools
get_daily_digestGet daily digestA

Fetches the daily AI news digest: a set of stories with headline, summary, why-it-matters, and sources. Omit date to get the latest published digest, or pass a date (YYYY-MM-DD) to get that day's digest.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoDigest date in YYYY-MM-DD format. Omit for the latest digest.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the transparency burden. It discloses the output structure and the date-dependent behavior, and 'fetches' implies a read-only operation. It does not cover auth, errors, or rate limits, but for a simple public digest tool this is acceptable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the primary action and output contents, followed by concise date instructions. No redundant wording.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with a single optional parameter and no output schema, the description sufficiently explains the return payload and how to target a specific digest. Missing edge cases are not critical for this simple tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%; the date parameter's format and optional behavior are already fully documented in the schema. The description repeats this same information without adding new meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description identifies a specific verb ('Fetches') and resource ('daily AI news digest'), and enumerates the story fields (headline, summary, why-it-matters, sources), clearly differentiating it from sibling tools that cover trends or pipeline stats.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear context on date usage (omit for latest, pass YYYY-MM-DD for a specific day), but does not explicitly mention alternatives or when not to use this tool relative to siblings such as get_trending_topics.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_pipeline_statsGet pipeline statsA

Fetches stats from the most recent ingestion pipeline run: sources checked, posts read, stories produced, and estimated reading minutes saved.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. The verb 'Fetches' implies a read-only operation, and listing the specific stats (sources checked, posts read, etc.) provides clear behavioral expectations. It also notes the 'most recent run' limitation, which is useful. It omits potential empty-state or auth details, but for a simple getter this is acceptable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, well-structured sentence, front-loaded with the verb and resource. It wastes no words and every element adds specific value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (zero parameters) and lack of an output schema, the description sufficiently covers what the tool does and what data it returns. Enumerating the stat fields essentially serves as the return value documentation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the baseline is 4. The description adds meaningful context about what the stats represent, which is helpful despite there being no parameter definitions to clarify.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific action ('Fetches stats') on a well-defined resource ('most recent ingestion pipeline run') and enumerates the exact data returned, which clearly distinguishes it from sibling tools focused on trends and digests.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description establishes clear context: it is for retrieving stats from the most recent ingestion pipeline run. It does not explicitly mention alternatives or when-not-to-use, but the purpose is so distinct from siblings that the context is sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_trend_detailGet trend detailA

Fetches full detail for a single AI trend by its id: summary, why it matters, full mention history, and the source references (posts/articles) behind it.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe trend's id, as returned by get_trending_topics.

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses the tool is a read operation ('Fetches') and describes the response contents, but does not mention error behavior (e.g., invalid id), rate limits, or any side effects. It adds useful detail about what is returned but omits potential failure modes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, well-front-loaded sentence that leads with the verb and resource, then lists the detailed contents. No wasted words; every element adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple single-parameter read tool with no output schema, the description covers the return value's key facets (summary, importance, history, sources) and links to the list tool via the schema. It lacks explicit error handling or response shape, but overall it gives enough context for correct invocation and expectation setting.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%: the only parameter 'id' is described as 'The trend's id, as returned by get_trending_topics.' The tool description merely restates 'by its id' without adding extra semantic nuance, so the schema carries the parameter meaning fully.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool fetches full detail for a single AI trend by id, and enumerates the content: summary, why it matters, mention history, and source references. This distinguishes it from sibling tools like get_trending_topics (which lists trends) by focusing on a single entity's detail.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The schema parameter description explicitly notes the id is 'as returned by get_trending_topics', giving clear context that this tool is used after listing trends. It implies the alternative for fetching the list is get_trending_topics, though it does not explicitly state 'use this only when you have a specific trend id' or list exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_digest_archiveList digest archiveA

Lists past daily digests (id, issue date, issue number, story count), paginated, newest first.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number, 1-indexed. Defaults to 1.
pageSizeNoResults per page (max 50). Defaults to 20.

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description takes on the full burden of behavioral disclosure. It clearly states that the operation is read-only (lists), discloses pagination behavior ('paginated'), and describes the ordering ('newest first'). This goes beyond a minimal statement and gives the agent a solid understanding of what to expect, though it omits details like response envelope or potential rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that packs in all essential information: the resource, the fields, pagination, and ordering. It is front-loaded with the verb and resource, contains no filler, and every phrase adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the core purpose, fields, pagination, and ordering, which is adequate for a simple list operation. However, since there is no output schema and no annotations, the description does not specify the response structure (e.g., whether results are wrapped in an object with pagination metadata), which is a notable gap for an agent that needs to parse the response.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already describes both parameters (page and pageSize) with their defaults and bounds, so schema coverage is 100%. The description mentions 'paginated' but does not add any additional meaning beyond what the schema already provides, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses the specific verb 'Lists' and names the exact resource ('past daily digests') along with the fields returned (id, issue date, issue number, story count). It also specifies pagination and ordering, clearly distinguishing this tool from siblings like get_daily_digest, which likely fetches a single digest.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description makes the primary use case clear: retrieving a paginated list of past daily digests. However, it does not explicitly mention when to prefer this tool over siblings (e.g., get_daily_digest) or provide any exclusions, so the guidance is implied rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_toolboxSearch cantkeepupwithai.comA

Full-site search across trends, digest stories, and the AI toolbox. Returns up to 5 matches per category. Query must be at least 2 characters.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesSearch text (minimum 2 characters).

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden of behavioral disclosure. It adds valuable constraints: 'Returns up to 5 matches per category' and 'Query must be at least 2 characters.' This provides actionable behavioral expectations beyond just saying 'search.' It doesn't explicitly state read-only status, but 'search' implies non-destructive behavior, and the stated limits are useful.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no wasted words. The first sentence states the purpose and scope; the second adds behavioral constraints. Information is front-loaded and easily parsed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple search tool with one parameter and no output schema, the description covers the key aspects: scope, result limits, and input constraints. It doesn't specify the exact fields of returned matches, but given the simplicity and the clear category grouping, it is sufficient for an agent to invoke the tool. A slight gap is the lack of return value details, but overall it's complete enough.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% coverage for the single parameter 'query' with a description including the minimum length. The tool description repeats this constraint ('Query must be at least 2 characters') but doesn't add semantic meaning beyond the schema. The baseline of 3 applies since the schema already documents the parameter fully.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states what the tool does: 'Full-site search across trends, digest stories, and the AI toolbox.' It uses a specific verb (search) and resource (full site), and differentiates itself from sibling tools that target specific content types. The mention of returning up to 5 matches per category further clarifies its scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context on when to use this tool: for site-wide search across multiple content categories. It doesn't explicitly mention alternatives or exclusions, but the sibling tools are obviously for specific lookups, so the usage context is clear. No explicit 'when not to use' is provided, but the scope is evident.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

TDQS

A4.4/5.0
Disambiguation5/5

Each tool has a clearly distinct purpose: trend lists vs. trend details, digest content vs. digest archive listing, full-site search, and pipeline stats. There is no functional overlap; even the two digest-related tools are easy to differentiate (content vs. metadata).

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern: get_ for single resources, list_ for collections, and search_ for search. Naming conventions are uniform and predictable.

Tool Count5/5

With 6 tools, the set is well-scoped for the server's purpose of exposing AI trends and daily digests. Each tool covers a necessary operation without bloat.

Completeness5/5

The tool surface covers the core content lifecycle: browse trends, inspect trend details, fetch digests, list digest history, and search across content. The addition of pipeline stats is a bonus. No obvious gaps for public read-only access.

Maintenance

ActivityMaintained
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/santapau10/cantkeepupwithai-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server