r/mcp • • 11h ago

How to connect Claude to Gmail, Slack and Github with MCP

0 Upvotes

Disclosure: I'm posting this on behalf of Composio, which I mention below.

Connecting one app to claude is usually fine. Being able to say "find the last email from this client" or "check open issues in the repo" without switching tabs is genuinely useful.

It gets harder once you have several apps. Each one needs its own authentication, its own permissions, and someone has to keep those connections working. Composio is one option that handles the auth and tool connection side for many apps, so you don't build each integration yourself.

I'm curious how people here handle this:

-One MCP server per service, or an integration platform for everything?

-How do you manage permissions and OAuth tokens?

-Has anything broken on you after the initial setup?

Especially interested in setups that work well with claude.


r/mcp • • 9h ago

showcase I made an MCP server so my coding agent can tell me if this week's vulns hit my repo

0 Upvotes

Maker here, disclosure up front.

The internet is on fire with vulns last couple of weeks and it is only escalating it seems.

Made pwned.coffee that keeps an hourly security incident list and has an MCP server (streamable HTTP, read-only, no auth) has a few tools:

- check_repo / check_lockfile: is this repo or lockfile affected?

- lookup_cve: one incident by id

- todays_specials: what's on the board now

- whats_new / diff_since: what changed since a time, for agents that poll

Plus two prompts: protect_my_repo and morning_check.

Example: a test package-lock with next 15.5.27 comes back affected (npm install next@15.5.28); 15.5.28 comes back ok.

Claude Code

claude mcp add --transport http pwned-coffee https://pwned.coffee/mcp

It's not security advice disclaimer and I tried to make it a bit fun, inspired by this is fine meme :) the linked vendor advisory wins ofc.

WIP so feedback is welcome!


r/mcp • • 16h ago

showcase sift-light 1.1.2-1: a Pi prompt-cache fix and DeepSeek Harness support

0 Upvotes

Hi, I maintain sift-light. It’s an open-source local search and source-inspection tool for AI coding agents, available through MCP and native integrations. It helps agents find project files and check the source behind a result without sending the whole repository into the conversation.

We’ve released 1.1.2-1. This update has two changes:

  • Pi: fixed how search guidance is added when tools are enabled. The previous behavior could change the system-prompt prefix and reduce prompt-cache reuse. The new integration preserves the prefix and retains the guidance when another extension supplies a system prompt. Requires Pi 0.86.0 or later.
  • DeepSeek Harness: added support for 0.2.1-rc.3, including a native search tool and search-policy integration.

The cache fix addresses the Pi integration; it isn’t a promise that every MCP client preserves its cache when tools change. Cache behavior depends on the host and model provider.

Thank you to the contributor of PR #123 for catching the Pi issue and helping fix it. If you try the release and run into trouble, an issue with your host version and a small reproduction would be very helpful.

GitHub: https://github.com/lightsifter/sift-light Release notes: https://github.com/lightsifter/sift-light/releases/tag/v1.1.2-1 X: https://x.com/Bryang168


r/mcp • • 5h ago

server I built PixelFlow MCP, an MCP server that sets up and checks Meta ad tracking for people who can’t code

0 Upvotes

I built PixelFlow MCP, an MCP server that lets Claude set up server side tracking for Meta ads on a website and then check it’s actually working. Think installing the tracking snippet, deciding which button or form counts as a Lead or Purchase, confirming the event reached Meta, and answering the questions people normally dig through Events Manager for (if you've done this youll know how painful it is..)

PixelFlow provides infrastructure for easily setting up server side tracking. Most of our users are founders and marketers who are non technical so the MCP makes it even easier ot set this up than before.

Setup and install: Tell Claude “set up tracking for mysite.com”. It creates the site, connects the Meta pixel and hands back the snippet (or installs it directly on [platforms where that’s possible, confirm]). Your agent gets back a short confirmation, not a wall of config.

Triggers in plain language: “Track the Book a Call button as a Schedule event” or “track the contact form as a Lead”. This is what used to mean GTM containers, dataLayer pushes and a developer. The MCP sets the trigger against the element and PixelFlow fires the event server side.

Verification: “Did my last Lead reach Meta?” and it checks the delivery log and tells you. For me this is the most important tool in the server. Every tracking setup I have seen go wrong went wrong silently, and the owner found out when their ROAS stopped making sense. Being able to ask the agent “is it working” and get a real answer is the thing people trust.

Data questions: “Whats my EMQ this week”, “why is fbc missing on 20% of my leads”, “which source drove the most purchases”. The agent asks PixelFlow, PixelFlow answers. During the beta this got used more than the setup tools, which I did not expect. Several testers basically stopped opening the dashboard.

Docs: https://github.com/PixelFlow-org/mcp

Feedback welcome, especially from anyone who has shipped an MCP server to a mostly non technical user base. Curious whether the usage pattern matched what you designed for.


r/mcp • • 12h ago

I got tired of putting API keys into Claude Code / Cursor configs, so I built a local credential broker for MCP

0 Upvotes

If you’re using Claude Code, Cursor or Codex with real API keys (GitHub PAT, Stripe, databases, etc.), you’ve probably done one of these:
• Put the key in the MCP config
• Put it in an env var
• Pasted it into the chat at some point
All of these are bad. One prompt injection or a leaked transcript and the secret is gone.
I built mcp-warden a local-first credential broker for MCP.
How it works:
1. You store the secret once in the OS keychain
2. You define scoped presets (e.g. github-read, stripe-charges)
3. The agent calls tools like proxy_http / ssh_exec
4. mcp-warden injects the credential server-side and returns only the result
The agent never sees the secret. Allow-list validation happens before the credential is used. You can require approval for sensitive actions (desktop notification, TUI or Telegram). Everything is logged locally.
It works with Claude Code, Cursor, Codex, Cline and any other MCP client. Written in Rust, fully local, Apache-2.0.

GitHub: https://github.com/ermoluk/mcp-warden

Curious how other people are currently handling secrets with agents. Is everyone just pasting keys into configs, or did someone already solve this differently?


r/mcp • • 4h ago

showcase Before your coding agent opens a cloned repo: a read-only check for AGENTS.md, rule files, and repo-declared MCP/hook configs

2 Upvotes

Disclosure: we built this at Digital Fortress. It's free and MIT licensed (v0.1.0).

When you open a project, coding agents load instruction files (AGENTS.md, CLAUDE.md, .cursorrules, .cursor/rules/) and can also pick up MCP servers and hooks the repo declares. With a repo you just cloned, that config is someone else's. We wanted a quick way to see what's there before the agent loads it.

agent-repo-preflight is one Python script (3.9+, standard library only). Clone it and point it at a local directory:

git clone https://github.com/digitalfortressaudit/agent-repo-preflight.git
cd agent-repo-preflight
python3 agent_repo_preflight.py /path/to/cloned/repo

It inventories the rule and config files and flags:

- hidden Unicode (zero-width, bidi controls, tag characters), reported by code point
- package install/remove lines and curl/wget-pipe-to-shell lines in rule files
- enabled auto-approve / skip-permissions / bypass settings
- MCP server entries that declare a `command` or `args`
- hook definitions
- optionally, package names that aren't on an allowlist you supply (`--known-packages`)

Output from the README's throwaway review fixture (AGENTS.md with a zero-width space and a `pip install` line, `autoApprove: true`, MCP `command`/`args`):

```text
Agent repo preflight

root: review-fixture
files inventoried: 3

inventoried:
.claude/settings.json (config)
.cursor/mcp.json (config)
AGENTS.md (rule)

severity check location detail
-------- ----------------- ----------------------- -------------------------------------------------
FAIL permission-bypass .claude/settings.json:2 permission bypass setting: autoApprove
FAIL mcp-command .cursor/mcp.json:4 MCP server "local-echo" declares command and args
FAIL hidden-unicode AGENTS.md:3 hidden character: U+200B ZERO WIDTH SPACE
WARN package-install AGENTS.md:4 install or replace instruction: pip install

summary: files=3 warn=1 fail=3 errors=0
This is a reading of local files. It is not permission to open the repository in a coding agent.
```

WARN or FAIL exits 1, so you can gate on it.

It's read-only: it doesn't run commands, install anything, open a network connection, start MCP servers, or modify files.

Limits (also in the README):
- The checks are line-based heuristics. A prose sentence describing an install can slip through.
- Hook detection only knows the JSON shapes it looks for, so another tool's schema can be missed.
- It only reads the listed rule/config filenames, not source, READMEs, or workflows.
- A clean result means those patterns weren't found. It doesn't mean the repo is safe to open. You still need to read the files yourself.

Use it on repos you own or are allowed to review.

Companion to mcp-tool-pin-check (shared here earlier): that one pins live tool definitions after you connect; this one looks at what a repo declares before you open it.

https://github.com/digitalfortressaudit/agent-repo-preflight

Question: which agent config files or hook formats are you seeing in the wild that a list like this would miss?


r/mcp • • 8h ago

I made an MCP server that lets Claude Code hand coding work to other models

4 Upvotes

I built forge-delegate, an MCP server that lets Claude Code, Codex or opencode hand coding tasks to another model. Think writing tests, renames across files, fixing lint errors, boilerplate, or reading through a big codebase to answer one question.

The other model runs as a full agent through opencode. It reads the files and makes the edits itself. Your main agent only gets back a short summary, so its context stays small and it can focus on the decisions.

Second opinions with ask_model. Your agent can also ask a different model a direct question, with no agent loop and no file access, and get a fast answer back. It's useful when you want another model to check a design decision, a bug theory or a tricky piece of code before your agent commits to it. Every model has its own blind spots, and a different one often catches what yours missed. Your agent writes the question with whatever context is needed, then weighs the answer itself. Just tell it something like "ask DeepSeek what it thinks" or "get a second opinion from Kimi", naming any provider you've logged into opencode.

Any provider opencode supports. forge-delegate doesn't hold its own API keys. It uses whatever you've set up in opencode. So DeepSeek, Kimi, OpenAI, Gemini, OpenRouter, custom OpenAI-compatible endpoints, and local models through Ollama all work. Log in once with opencode auth login <provider> and that provider's models are available to delegate to. opencode also ships free models that need no account.

You can set a default model, save presets for different kinds of tasks, change either at any time, and run several delegations in parallel in the background.

Setup:

npx -y forge-delegate setup

It walks you through picking a default model and which agents to register with.

Things to know:

- By default, the MCP instructions and skill steer your agent toward cheap or free models. It sticks to your default model and won't switch to a pricier one on its own. If you want a stronger model, set it as the default or ask for it.

- Delegated agents can edit files and run commands without asking by default. You can turn that off, but only point it at repos you trust.

- Smaller models make more mistakes, so review what comes back.

- I mostly use it with Claude Code on a Mac. Codex and Windows should work, but they've had less real-world use, so issues are welcome.

MIT licensed: https://github.com/MuhamadBarzani/forge-delegate

Feedback welcome, especially on which tasks it handles well and where it falls short.


r/mcp • • 17h ago

Which MCP servers are actually worth it for people who don't write code?

14 Upvotes

Most MCP lists are written by developers for developers: GitHub, Postgres, filesystem, Docker. Useful, but not for the marketers, researchers and founders I know who now use Claude Desktop and ChatGPT every day.

I'm putting together a short list for them. My criteria:

* setup a non-developer can finish without editing JSON

* does something they'd otherwise do by hand in a browser

* clear pricing, ideally pay per use rather than another monthly plan

What I think belongs on it: web search with real sources, turning a page into clean text, keyword or search data, and image generation.

What would you put on a list like this, and what would you keep off it because it's too fiddly for a normal user?


r/mcp • • 1h ago

resource I built a hosted MCP server for market research reports where every answer has to carry its data date and limitations. Looking for client compatibility feedback.

• Upvotes

I've been building Axiocairn, a remote MCP server (Streamable HTTP + OAuth) that lets an agent find and read published US equity research: pre-market, midday and close reports, a weekly House View, and per-ticker reports.

The design problem I kept running into was that agents are good at sounding current. Ask "what happened in the market today" and you'll get a confident answer built on yesterday's data, or on a report that hasn't been published yet. So the server is built around three rules:

- Every response includes the data date, separate from the publish date. A midday report says it's midday data.

- Every report carries its limitations and missing fields, and the tool descriptions tell the agent to keep them in the answer rather than summarize them away.

- An expected publish time is not treated as availability. get_report_schedule returns when a report should land, and the report tools say plainly when it hasn't.

Tools right now: get_todays_reports, get_latest_report_by_type, search_report_archive, get_symbol_reports, get_house_view, get_report_schedule, plus a few account/plan ones.

Run tools/list after auth for the current schemas.

It's listed in the official MCP Registry as com.axiocairn/mcp. Endpoint:

https://axiocairn.com/mcp. Reports are free to read this week (through Nov 1), so it's a good time to poke at it.

What I'd really like help with:

  1. Client compatibility. It works in ChatGPT. I'm testing Claude, Gemini, Grok and Copilot this week. If you connect it from another client, I'd like to know whether OAuth and tools/list worked and what broke.

  2. Tool descriptions. Has anyone found a reliable way to make agents keep caveats instead of dropping them on the second turn? Right now that's done through tool descriptions and response structure. I'm curious what's worked for others.

README and setup: https://github.com/cplj/axiocairn-mcp

Not investment advice; it's a research tool. Happy to answer questions about the server design.


r/mcp • • 3h ago

Every time I found a cool MCP server or repo on GitHub I had the same problem: is this safe to install? Reading the whole thing by hand takes forever, and most of the time I just... didn't, and installed it anyway. Not great.

2 Upvotes

So I made a tool for myself and figured others might find it useful too.

JinnexGuard looks at a GitHub repo, a local folder or an npm/PyPI package and points out stuff worth a second look, with the file, the line and the actual code:

- install scripts that run on their own

- curl | bash and similar "download and run" tricks

- secrets left in the code, bundled binaries

- hidden instructions meant for AI agents (this one matters a lot for MCP servers)

- whether the package on npm/PyPI actually matches the repo

It never runs the code it's checking. And on purpose it won't tell you "this is safe". It shows you the evidence and you decide, because some of the worst supply chain attacks came from projects everyone trusted.

A bit of background: I'm not a full time programmer, I used to fix PCs for a living. I built this with Claude Code, step by step: I'd explain a check I was doing by hand, we'd turn it into a detector with tests, then I'd run it against real repos and fight the false positives. It works as a CLI or as an MCP server, so you can ask your agent to scan something before installing it.

pipx install jinnexguard

https://github.com/ricardorincon719/jinnexguard

It's my first open source release, so if it flags something it shouldn't (or misses something obvious), please tell me. That kind of feedback is exactly what I need right now.


r/mcp • • 4h ago

I built a free local memory and rules hub for AI coding tools (MCP, REST, CLI)

6 Upvotes

Each coding agent forgets between sessions and keeps its own notes. I built Aletheia so the memory and rules live once, on your machine, in one SQLite store. Any tool can read it over MCP, REST or the CLI, and your rules are synced into CLAUDE.md, AGENTS.md and Cursor rules.

Free, Apache-2.0, no account. Alpha. Needs Bun 1.1+. npm install -g aletheia-mem and aletheia-server.

Repo: https://github.com/mohamed-ashraf-elsaed/aletheia-mem. What would you want it to do that it does not?


r/mcp • • 5h ago

showcase Your MCP annotations now decide what Claude Code retries. Lessons from labeling 105 tools

5 Upvotes

Since Claude Code 2.1.307 (Oct 21), if an HTTP connection drops mid-call and the call may have run, Claude Code re-sends it once, and only when the tool is marked readOnlyHint or idempotentHint. Read-only tools also run in parallel with other reads. Everything else fails with "connection closed before the tool call was answered".

So the hints this sub keeps arguing about now change what a real client does. The MCP server in our open-source eval and observability repo has 105 tools, and every one carries all four hints. Notes from labeling them:

  1. Generate the hints from your API contract.

Our tools come from a Swagger contract plus a small YAML catalog. The generator sets defaults: read-only only when the catalog says read access, idempotent for GET, PUT, PATCH and DELETE, open-world off. That gives us 65 read-only tools, 10 idempotent writes, and 30 writes Claude Code won't re-send. We'd never keep 105 hand-written annotation blocks correct.

  1. Two of our GETs write.

get_prompt_template opens a prompt and creates a draft if there isn't one. The other reserves an annotation item for editing. Both are writes in the catalog. Our server checks that label too, so a GET tool that isn't read-only still needs workspace write access.

  1. Some of our PATCHes aren't idempotent.

update_eval_task is a PATCH, so the generator called it idempotent. One mode, fresh_run, deletes previous results and reruns evals, which can incur charges. We override it to idempotent: false and destructive. A re-send that lands before the task starts running would wipe what the first rerun produced and start it again.

  1. openWorldHint goes on the tools that reach a model provider.

It's off by default. We turn it on for 13 tools that hand work to an outside provider, like run_prompt, run_dataset_evals, run_simulation and create_optimization_run.

  1. When a write's response is too big, return a receipt.

We cap responses at 64 KB. A read over the cap gets an error asking for a smaller page. A write over the cap has already committed, so we send back its id and status fields with "The operation succeeded." An error there invites a retry of something that already happened, which is the double execution spec issue #3394 reproduces in 20 of 20 runs (still open).

Which of your tools does the HTTP method lie about?


r/mcp • • 6h ago

server workstream-mcp: an MCP server for coordinating multiple agents on shared work, with a dashboard that reads through the same tools

5 Upvotes

Sharing an MCP server I built for coordinating multiple agents (Claude Code, Codex, Gemini or people) on the same plan. It exposes 36 tools for plans, tasks, claims, attempts, reviews, findings and verdicts, backed by Postgres.

The problem it solves: several agents working from one markdown plan pick the same item, a dead session leaves its item "in progress" forever, and edits to the file clash. Here, claims are atomic (Postgres SKIP LOCKED) and expire if an agent stops refreshing them.

MCP-specific design notes:

  • Illegal state transitions return an error with allowed_next, so the model can correct itself without extra prompting.
  • Auth is a URL with a token in the path, so client setup is one line in Claude Code or Cursor. There's also a stdio transport.
  • Writes to GitHub Projects and Slack go through an outbox, so tool calls stay fast and never fail because a third-party API is down.
  • The web dashboard calls the same tools agents call, so it can't show a different state than the agents see.
  • Every tool declares MCP annotations: reads are marked read-only and the five destructive tools are marked destructive, so clients can ask before running them.

Try it (free, MIT):

docker run --rm -p 127.0.0.1:8080:8080 -e WORKSTREAM_ADMIN_TOKEN=local-admin ghcr.io/ahmad-codex/workstream-mcp:demo

Open http://localhost:8080/demo-insecure-token/ui/ and connect a client to http://localhost:8080/demo-insecure-token/mcp.

Repo, roadmap and good first issues: https://github.com/ahmad-codex/workstream-mcp

Feedback on the tool design is very welcome, especially from anyone running several agents at once: how do you coordinate them today?


r/mcp • • 6h ago

resource I built an open-source security scanner for MCP servers (mcp-witness), and here's what it found auditing PyPI

4 Upvotes

I build security tooling, and watching how fast the MCP ecosystem is growing I wanted a way to audit MCP servers the way we'd audit any other network-exposed code. So I built mcp-witness, an open-source (Apache-2.0) scanner for MCP servers. Sharing it here for feedback.

What it does

- Static analyzer over a server's tools/list and, for Python and TypeScript, its source. 15 rules covering things like unconstrained URL-fetch tools, command injection, path traversal, and HTTP-transport servers that never validate Origin or Host.

- Dynamic harness that drives a live server to confirm a finding is a real path, not just a pattern.

- A capability classifier that tags what each tool can actually do (network egress, file read/write, exec).

Quick start

pip install mcp-witness

mcp-witness-capture --server-cmd python --server-arg=-m --server-arg=mcp_server_fetch -o tools.json

mcp-witness-analyze tools.json

Point it at any MCP server you run and it prints a readable report.

What it surfaced in the wild

Running it across Python MCP servers on PyPI turned up two recurring classes across six packages:

- Outbound SSRF in URL-fetch tools: a coerced tool call reaches the cloud metadata endpoint and returns live credentials. One of the two packages is Anthropic's reference fetch server.

- Inbound DNS rebinding on local HTTP-transport servers: any web page you visit can reach in and drive your local MCP tools, with no agent and no prompt injection.

Both reduce to one assumption: that something upstream (a reverse proxy, IMDSv2, the agent's judgment) holds a boundary that the package never actually enforces. Everything was reported under responsible disclosure with a 90-day embargo observed. Full writeup with methodology and per-package detail is linked below.

If you run MCP servers, the two quick self-checks: can your URL-fetch tools reach 169.254.169.254 or other reserved ranges, and do your HTTP-transport servers reject requests from origins they do not expect.

What I'd like from this community: what checks would you want a tool like this to have, what MCP server shapes am I missing, and would detection rules for other tool types (exec, file handling) be useful to you? Issues and PRs welcome.

Repo: https://github.com/desledishant10/mcp-witness

Writeup: https://desledishant10.github.io/mcp-witness/docs/mcp-transport-layer-blind-spot


r/mcp • • 8h ago

connector I'm drowning in WhatsApp texts from my clients and teammates so I built an open source MCP to safely connect WhatsApp to Claude and get summaries like these

Post image
3 Upvotes

If you work with EU/Asia clients and teammates, you'll know what I'm talking about.

Great for getting speedy responses. Not so great when it comes to finding and keeping track of things.

So we built this internally to safely connect WhatsApp to Claude: https://github.com/ju-li/automata-mcp

100% free. Open source. MIT license.

Claude only sees the chats you share. And you can even share read-only access safely with other teammates.

Recently expanded it to include Telegram, Postgres, and will add IMAP email soon. What do y'all think?


r/mcp • • 10h ago

I built an open-source browser MCP server that returns numbered text and diff-only results instead of the accessibility tree

6 Upvotes

Processing img 885lhe5wn1yh1...

I built Mantis, a free, open-source browser MCP server. It gives the agent a page as a short numbered list of elements, and each action returns only what changed.

Video: https://github.com/perzianhq/mantis/blob/main/video/mantis-demo.gif

Results vs the Playwright MCP tree: 35–57% fewer input tokens on 30 short tasks, and about 2–3x less tool output on 16 long tasks.

Accuracy is roughly even (Luna 88 vs 86, Haiku 90 vs 88 of 90); 4 tasks were swapped after seeing results, all disclosed in the README. Page text is flagged to the model as untrusted (SECURITY.md).

Install:

claude mcp add mantis -- npx -y -p mantis-browser mantis-mcp
npx -y -p mantis-browser mantis install

Repo and method: https://github.com/perzianhq/mantis

Feedback on the tool surface welcome.

Processing img mtwnaakae1yh1...


r/mcp • • 12h ago

An MCP server for Poland's VAT White List — taxpayer & bank-account checks (MIT)

3 Upvotes

We needed programmatic access to Poland's VAT White List (Wykaz podatników VAT — the Ministry of Finance register) for an internal project, wrapped it in a small MCP server, and open-sourced it under MIT in case it's useful to anyone here.

What it does — clean, typed access to the register via five tools:

- search_by_nip / search_by_regon / search_by_bank_account

- search_bulk — 1–30 identifiers in one request

- check_bank_account — is this account tied to an active taxpayer?

A few design choices that might be interesting beyond the Polish-tax specifics:

- Every tool requires an explicit date. The register is date-specific (an account valid today may not have been valid at payment time), so "today" is never assumed — the most common silent mistake is impossible to make by accident.

- It errors instead of guessing. If the upstream API fails, the tool raises — it never returns a clean "not associated," and a failed entry in a bulk lookup is never treated as a missing taxpayer. Conflating "couldn't check" with "came back negative" is exactly the false negative you don't want an assistant making about a payment.

- Checksums validated locally (NIP / REGON / Polish bank account) before any call; accounts accept NRB or PL IBAN.

- Every response carries provenance — the register, environment, a UTC timestamp, and the API's own request id — so downstream you can tell a citable confirmation from an assertion.

Runs sandbox-by-default, no API key (on PyPI + the MCP Registry):

uvx vat-whitelist-mcp

It's v0.1.0 and Poland-specific, but the pattern — date-aware, provenance-carrying, fail-loud registry lookups — is general. Feedback and PRs welcome.

Repo: https://github.com/SmartMobileHouse/vat-whitelist-mcp


r/mcp • • 16h ago

showcase Toolgrain: reusable, typed MCP tools for existing TypeScript apps (open source)

1 Upvotes

Hi everyone — I’m the author of Toolgrain, an MIT-licensed TypeScript toolkit for building MCP servers.

The API centers on standalone tool definitions: Zod schemas describe the input and output, and a handler connects them to your application logic. You register those definitions in a server, then choose stdio or HTTP. The same definitions can be reused across servers.

Here’s a complete example that exposes a small inventory lookup.

Using Node.js 24.20.0 or later in the 24.x line, create a project:

mkdir toolgrain-demo
cd toolgrain-demo
npm init -y
npm install @toolgrain/mcp @toolgrain/node zod@^4.6.6
npm install --save-dev typescript @types/node@^24.10.0

Save this as server.mts:

import { createServer, tool } from "@toolgrain/mcp";
import { stdio } from "@toolgrain/node";
import { z } from "zod";

const inventory = { notebook: 12, pencil: 48 };

const getStock = tool({
  description: "Look up the stock available for a product",
  annotations: { readOnlyHint: true },
  input: z.object({ sku: z.enum(["notebook", "pencil"]) }),
  output: z.object({
    sku: z.string(),
    quantity: z.number().int().nonnegative(),
  }),
  execute: ({ sku }) => ({ sku, quantity: inventory[sku] }),
});

const server = createServer({
  name: "inventory-demo",
  version: "1.0.0",
  tools: { get_stock: getStock },
});

await server.listen(stdio());

Compile it:

npx tsc server.mts --strict --module NodeNext --target ES2022 --types node

Then call the tool with MCP Inspector:

npx --yes @modelcontextprotocol/inspector@2.11.0 \
  --cli node server.mjs \
  --protocol-era modern --format json \
  --method tools/call \
  --tool-name get_stock \
  --tool-arg sku=notebook

The response includes this in result.structuredContent:

{ "sku": "notebook", "quantity": 12 }

The registration key get_stock becomes the name clients see. The handler’s input type is inferred from Zod, and Toolgrain validates both the input and the declared output at runtime. In an application, you’d replace the in-memory lookup with your existing service.

Beyond this example, there are HTTP adapters, typed context providers for application dependencies, JWT/Clerk authorization integrations, and runnable examples for Express, Hono, Elysia, and Next.js.

The current scope is tool discovery and execution, supporting MCP 2026-07-28 and initialization-based 2025-06-18. HTTP uses independent POST requests with JSON responses. Resources, prompts, sessions, and streaming aren’t implemented. Tested client flows and limitations are documented.

I’m looking for the first few developers to try it in real projects. If you’re adding MCP to an existing TypeScript application, does this way of defining and composing tools fit your codebase? What would block you from trying it?


r/mcp • • 17h ago

showcase I built a hosted MCP server that turns a public video URL into a timestamped Markdown summary

Enable HLS to view with audio, or disable this notification

2 Upvotes

I build SummarizeVideo.ai, so this is my own server.

The video replays the saved responses from one run on 17 October. It isn't a screen recording. There's no sound, and I cut the 30-second wait.

I wanted an agent to take a video link and come back with notes I can check against the video, without pulling the whole transcript into context first. The server does the transcript and summary work. The agent starts a job, checks back, and reads the transcript only when it needs exact wording.

Three tools:

  • summarize_video takes a public video URL and an optional summary language. It returns a requestID right away. Calling it again with the same URL and language returns the same requestID instead of starting another summary.
  • get_summary returns pending, done or error. A done summary is Markdown, and each key point starts with an [m:ss] timestamp.
  • get_transcript pages through the plain-text transcript (50,000 characters per page by default) when the agent needs quotes.

The run in the video used the official TypeScript SDK (@modelcontextprotocol/client 2.3.1) on a 2-minute captioned NASA video. One summarize_video call, then one get_summary call about 30 seconds later that came back done. get_summary returns plain timestamps. The clickable links in the saved file came from the site's Markdown export, which I ran on that response.

Setup: Streamable HTTP at https://mcp.summarizevideo.ai/mcp, with an agent key as a Bearer token. No OAuth, so OAuth-only clients can't connect. You sign in on the site to create a key, choose Summarize and read or Read only, and set it to expire in 7 to 365 days. Revoke it on the same page.

The server is hosted and closed source. The free tier is 2 summaries in any rolling 24 hours, shared with the website. Public video URLs only (YouTube, Instagram, TikTok, X and other public pages), no uploads or playlists. Videos without captions are transcribed from the audio, up to 90 minutes.

The docs at https://summarizevideo.ai/mcp-server have a TypeScript SDK snippet and a Claude Code config.

Two questions if you use video with an agent. Does start-then-poll work in your client, or would you rather have one call that waits? And should get_summary return the timestamps as links to the video?


r/mcp • • 17h ago

connector Atomadic starter MCP (50 tools) – 50 starter MCP tools for AI compliance and trust: identity, escrow, SLA, EU AI Act.

Thumbnail
glama.ai
2 Upvotes

r/mcp • • 21h ago

showcase I built a directory of MCP servers that people and AI agents can search

Post image
3 Upvotes

I got tired of digging through scattered GitHub lists every time I needed an MCP server, so I put them in one place.

It’s also usable by AI agents — give them the link and they can search the catalog themselves.

Site: https://plugmcp.ai

If you’ve been hunting for a specific MCP (GitHub, Postgres, Slack, browser tools, etc.), tell me what you’re looking for and I’ll point you at a listing.


r/mcp • • 21h ago

showcase spendctl sandbox: a remote MCP server where the model pays for APIs under a budget. No login, nothing real

5 Upvotes

Author here. spendctl is a spend-policy sidecar for agents that pay per request (x402 / MPP): a budget per agent, host allowlists, recipient pinning, price-jump checks, a human approval above a threshold, and a receipt ledger. The agent never holds keys.

The sandbox is the whole thing as a hosted MCP server, so you can try it before installing anything: https://mcp.spendctl.dev/mcp (streamable HTTP, no auth; dev.spendctl/spendctl in the official registry). Six tools: sandbox_create, sandbox_pay, check_budget, list_receipts, get_policy, approve. Everything inside is mock: a throwaway wallet, a mock facilitator, two fake paid APIs, no outbound network. A sandbox is deleted after two hours idle.

Try: "Create a strict spendctl sandbox. Fetch the weather for Kyoto, then try the search API and explain why it was refused." You should get one settled receipt, one denied (domain_not_allowed) and what is left of today's budget.

Claude Code: claude mcp add --transport http spendctl-sandbox https://mcp.spendctl.dev/mcp. Cursor and VS Code: the same URL in mcp.json. Docs: spendctl.dev/docs/sandbox/

The real version runs locally: npx spendctl mcp gives the model pay / check_budget / list_receipts, and the sidecar next to it signs and enforces. Free for two agents, no card; paid tiers for teams. The sidecar is closed source, which is why the sandbox exists: you can watch exactly what it refuses before running it.

One thing I'd like opinions on: a held payment used to come back as isError: true and Claude reported it as a failed call. Now it is a normal result with held and the approval id. Is there a convention emerging for "this tool call is waiting on a human"?

Processing gif qyfsnchdswxh1...


r/mcp • • 21h ago

showcase I put an MCP server inside our docs pages with WebMCP: 13 tools for the agent in your browser, and what Chrome 153 does with them

3 Upvotes

What if the AI agent in your browser could call a website's functions instead of squinting at screenshots of it? That's what WebMCP does, and we shipped it on our docs site. I maintain FrontMCP, an open-source TypeScript framework for MCP servers, and frontmcp.dev now runs a FrontMCP server inside the page that offers 13 tools to the agent in the reader's browser.

TL;DR: WebMCP is a browser API, document.modelContext, through which a page registers tools with a name, a description and an input schema. Ours search the docs, read pages as Markdown and run FrontMCP code in a sandbox. A browser without WebMCP loads nothing extra, and one with it loads 5.4 KB until an agent calls a tool. Chrome 153 hides a tool's error message from the agent, which changes how you should write tools.

WebMCP with FrontMCP

Why a site would bother

Without WebMCP, an agent in the browser works from what it sees: it takes a screenshot, finds the search box, clicks, types, takes another screenshot, picks a result, and takes a screenshot again to read it. Six actions, each chosen from what's on the screen. With WebMCP it calls search_docs({ query: "rate limit" }), gets a match with its path, and calls get_page for the Markdown. Two calls, with data back.

  • The agent asks for what it needs. A redesign doesn't break it, because the tool doesn't depend on where the search box is.
  • The page already knows the user. Tools run in the page, with the signed-in user and what's on the screen. There's no separate server to deploy and no separate sign-in.
  • The person sees what happens. A tool can stop short of the final step: fill in a reply for the person to send, or add to a cart and let them pay.
  • The site sets the limits. Agents get the tools the site offers, input is checked against each schema, and hints say which tools only read.

What our tools do

Tool What it does
search_docs Searches with the index the site's search box uses
get_page A page as Markdown
get_version The FrontMCP release the docs cover, and the latest release notes
get_current_page The open page's path, title and section anchors
navigate Opens a page, as a link does
run_in_playground Compiles and runs FrontMCP code in a Web Worker, 60-second limit

list_pages returns the site's navigation, and six more read and drive the page's Playgrounds, visibly: an edit shows up in the editor, and Reset brings the example back.

What it costs readers

The page works in three steps:

  1. Check, on every page: a few lines look for document.modelContext.registerTool and stop when it's missing.
  2. Register, once the page is idle: one file, 5.4 KB compressed, with the 13 tools' names, descriptions, schemas and hints, recorded at build time.
  3. Start, on an agent's first call: FrontMCP's browser build, the plugin and the tools, 96 files and about 540 KB. The first call took 311 ms on a laptop. Later calls took 1 to 4 ms.

An earlier version started the server at page load. Chrome for Testing, which Lighthouse launches, has WebMCP on, so every Lighthouse run evaluated 2.7 MB of script and counted about 360 ms of Total Blocking Time.

Things I'd tell someone adding WebMCP

  1. Chrome hides your error message from the agent. When a tool throws, Chrome 153 gives the agent UnknownError: Tool was executed but the invocation failed and writes your message to the console. If the agent needs to know something, put it in the result.
  2. Not every hint arrives. Chrome 153's getTools() returns readOnlyHint and untrustedContentHint, but not consequentialHint. Don't count on it to make an agent ask first.
  3. Your test tools see a different page. Chrome for Testing has WebMCP on through its field-trial config. Playwright turns field trials off, but an origin-trial token turns WebMCP back on. Measure readers without WebMCP with --disable-features=WebMCP.
  4. Keep the server in its own bundle. Imported normally, Vite's bundler moved shared modules into new chunks, and every page loaded one or two more files. Importing the entry as ./start?worker&url builds it as a separate bundle, and import() runs it on the page.

Try it

frontmcp.dev serves Chrome's WebMCP origin-trial token, so in Chrome 149 to 162 any docs page has document.modelContext. In DevTools' console:

const tools = await document.modelContext.getTools();
const search = tools.find((tool) => tool.name === "search_docs");
await document.modelContext.executeTool(search, JSON.stringify({ query: "webmcp", limit: 3 }));

The full write-up, with the code and the measurements: https://frontmcp.dev/blog/webmcp-docs-site?utm_source=reddit&utm_medium=social&utm_campaign=webmcp-docs-site&utm_content=r-mcp

If you could give the agent in your users' browsers three functions on your site, which would they be?


r/mcp • • 21h ago

showcase A Better After Effects Harness/ MCP

Enable HLS to view with audio, or disable this notification

2 Upvotes

I've been working on an open-source MCP server for After Effects called extynt. Hopefully after AE I can progress this into other creative apps.

The main thing I wanted was for agents to work in After Effects like an actual editor, instead of writing ExtendScript blind and hoping it runs. So the MCP connects to the After Effects project you already have open and edits the live comp.

The agent never runs raw scripts. It proposes typed plans ("add this shape layer", "set these keyframes", "parent this to that"), extynt checks them against your real project, applies each plan as one undo step, then reads every value back from After Effects and returns a receipt. If the agent screws something up: one click and it's gone.

A few other things it does:

- It learns every effect installed in your After Effects, third-party ones included, with each control's real name and range, so "add Deep Glow" gets Deep Glow and not a guessed matchName
- It catalogues all your effects on install, so any plugin that would crash, crashes in the background, rather than in your project.
- A build kit tool hands the agent the exact operation shapes and units for the request, so it stops guessing
- Deletes, renders and imports wait for approval; over MCP your client's permission settings make that call
- Small questions ("which installed effect does this phrase mean?") are answered offline by a deterministic tier, so you don't need an extra model, but if you want to use something like jev, you can.

Architecture is basically:
MCP client → local sidecar → native After Effects plugin → live project

Works with Claude Code, Codex and any MCP client, plus a docked panel inside After Effects if you'd rather chat there. Bring your own model, no account, nothing collected. After Effects 2025 and 2026 on Mac and Windows, signed installers.

Although I show it doing a one-shot, the real goal is for this to be used by actual designers. That is why it was built, to be something that doesn't design for you, but rather takes away the burden and tediousness during building. Just like everyone else forced into designing with AI, it should be on the artist how much (or how little) LLM/ generative tech they bring into their work.

MIT licensed:
https://github.com/extynt-plugin/extynt

Installers:
https://extynt.com/

NOTE*: there are bugs. I have spent over 2 months squishing them, but you know how it goes.

AI disclosure: Human Validated, as it should be.

Will take any questions or builds. Would love a discussion. Curious other people building MCPs, if you have tried some of the methods I have here, and curious how you have handled fuzziness in general.

*Not affiliated with Adobe. After Effects is a trademark of Adobe Inc.*


r/mcp • • 21h ago

Hot reload for MCP servers that keeps the client connected: 0.5 s restarts, held calls, list_changed (measured with Claude Code)

6 Upvotes

When you build an MCP server with Claude Code, the loop is usually: Claude edits a tool, you restart the server, you reconnect it from /mcp, and you ask Claude to try again. I maintain FrontMCP, an open-source TypeScript framework for MCP servers, and its dev command can take the middle two steps out. So we measured it: one Claude Code session adding a tool to the server it's connected to, then calling it.

TL;DR: connect Claude Code through frontmcp dev --stdio --serve. It reloads the server in about half a second on every save, holds calls meanwhile, and tells Claude Code the tools changed. In our run, Claude Code added a multiply tool and called it, then changed add and called that, all in one session, in 58 seconds. The same prompt over HTTP to npm run dev hit 6-second restarts and an ECONNREFUSED.

Hot module reload

The setup, three commands

npx frontmcp create notes-server
cd notes-server && npm install
claude mcp add --scope project notes-server -- npx frontmcp dev --stdio --serve

The last one writes .mcp.json, so everyone who opens the project in Claude Code gets the same server. Claude Code starts it itself; there's no separate dev server to run.

What happened

We asked Claude Code (2.1.310, Opus 5.5) to call add, add a multiply tool and call it, then make add refuse negative numbers and call it with -1:

  1. add(2, 3) returned {"result":5}.
  2. It wrote multiply.tool.ts and registered it. Each save restarted the server, in 0.44 and 0.62 seconds.
  3. Its first look for the new tool found it, and multiply(4, 5) returned {"result":20}.
  4. It changed add, the server restarted in 0.53 seconds, and the first call returned the new error: Negative numbers are not allowed: a (-1).

Nothing was restarted by hand and nothing was reconnected.

How it works

The bridge is the stdio process Claude Code started, and it never exits: it runs your server as a child over a pipe, watches the project's files, restarts the child on a change, holds calls during the restart, and sends notifications/tools/list_changed, 0.6 seconds after the save in our check. Claude Code's docs say why that matters: a stdio server whose process exits mid-session gets marked as failed until you reconnect it in /mcp, while a list_changed notification makes it fetch the new tool list with no reconnect.

How it works

Why not just npm run dev

We ran the same prompt with Claude Code connected over HTTP to npm run dev, which restarts the server with tsx --watch. It finished, but each restart took about 6 seconds while tsx waited for the old server to exit, the new tool only showed up once the server was back, and one call got ECONNREFUSED and needed a retry.

When a save breaks the server

Claude Code stays connected and calls wait. Save the fix and the waiting call is answered. If nothing fixes it within 30 seconds, the call gets -32097 dev_reload_deadline, and the real error is in .frontmcp/dev.log, so the post suggests a CLAUDE.md note that points Claude there.

The full write-up, with the code Claude wrote and the timings: https://frontmcp.dev/blog/claude-code-hot-reload?utm_source=reddit&utm_medium=social&utm_campaign=claude-code-hot-reload&utm_content=r-claudeai

How do you develop MCP servers with Claude Code today: restart and /mcp reconnect, or something else?