Neutra

io.github.emokeoPublished by GitHub account emokeov0.2.0Updated Nov 6, 2026

Two people's AI assistants find a meeting time without either seeing the other's calendar.

VerifiedStreamable HTTPWeb executableProductivity & WorkflowCommunication & Collaboration

Overview

AI-generated overview

Neutra is a remote MCP server where two people's AI assistants privately compare free times and settle on a meeting slot without either side seeing the…

What you can do
  • Start a meeting decision with your person's free times and the meeting length, returning a code and a message to forward
  • Answer someone else's decision with that code and your person's free times, which sends a calendar invite when a match is found
  • Check a decision's status and matched meeting time, or cancel a decision you started along with its invite
  • Read back your own answer
  • Send and read feature requests to the makers
When to use it
Useful when two people want their assistants to agree on a meeting time across different assistants, while keeping each person's availability private. Also handy when the other person has no assistant and answers through a simple sign-in page instead.
Requirements
Remote endpoint at neutra.day, added as a custom connector; no local install. Google sign-in is required, and the server uses only your name and email. Both sides need MCP-capable assistants, or the answering side can use the browser page.
Before you install
Signing in with Google shares your name and email with the service. The server sends calendar invites and email on your behalf through its own inviter account, so a match can create events in your calendar. Decisions you start can be cancelled, and times are kept until settled or at most 14 days. Usage is rate-limited.

Installation

In SourceWeft

  1. Open Neutra in the dashboard and add it to a workspace.
  2. Connect the required credentials. They are stored privately and never shown on public pages.
  3. Enable the server for the chats that should use its tools.

Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.

Use with an agent

Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.

Read https://sourceweft.com/mcp/io.github.emokeo%2Fneutra/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.

Read the install guide the agent follows

Other MCP clients

Add this to your client's mcpServers config. The client completes OAuth sign-in on first connect.

{
  "mcpServers": {
    "neutra": {
      "type": "http",
      "url": "https://neutra.day/mcp"
    }
  }
}

README

Neutra

A neutral place where people's AI assistants agree on things for them, without anyone seeing anyone else's data.

Today it does one thing: two people's assistants find a time to meet. Each assistant tells Neutra when its person is free. Neutra finds a common time and sends one calendar invite to both. Neither side ever sees the other's times.

mermaid
sequenceDiagram    participant A as Anna's assistant    participant N as Neutra    participant B as Ben's assistant    A->>N: Anna's free times    N-->>A: a message for Anna to forward to Ben    Note over A,B: Anna forwards it in any chat    B->>N: Ben's free times + the code    N-->>A: calendar invite    N-->>B: calendar invite

It works across assistants: Anna can use Claude and Ben another assistant, as long as both support MCP connectors. Ben can also answer without an assistant: the message includes a link to a simple page where he signs in with Google and adds the times he's free.

Privacy, by design

  • No AI on Neutra's side. Neutra is plain code that compares time ranges. Your times never go into an AI model of ours.
  • Nobody sees anyone's times. Only the matched meeting time comes back. The other person's times are never returned, and the code is stored only as a hash.
  • Times are deleted as soon as a decision is settled, at the latest after 14 days. The person answering never has their times stored at all.
  • Retries can't map a calendar. The person answering gets at most 3 tries, and each answer must cover at least twice the meeting length, so nobody can probe your free time slot by slot.
  • Data stays in the EU, in Cloudflare's EU jurisdiction.
  • Checked by tests: test/decisions.test.ts verifies that no times or codes appear in any response.

Details: privacy page.

Try it

  1. In Claude: Customize → Connectors → Add custom connector, URL https://neutra.day/mcp, then Add.
  2. Sign in with Google. Neutra uses only your name and email: to send the invite to the right address, and so that only you can answer.
  3. Ask: "Use Neutra to find an hour with Ben next week. I'm free Tuesday and Thursday, 18:00–21:00." Forward the message it gives you.

For agent builders

A remote MCP server with Google sign-in. Resources follow Google's AIPs: decisions/{decision} and decisions/{decision}/answers/{answer}.

ToolWhat it does
create_decisionStart a decision with your person's free times and the meeting length. Returns a code and a message to forward.
create_answerAnswer with the code from the message (neutra:<id>.<code>) and your person's free times. A match sends the invite.
get_decisionStatus (WAITING, NO_MATCH, INVITE_SENT, ACCEPTED, DECLINED, EXPIRED) and the meeting time.
delete_decisionCancel a decision you started, including its invite.
get_answerRead your own answer.
create_feature_requestTell Neutra's makers about something your person wanted that Neutra can't do yet.
get_feature_requestRead a feature request you sent.

Errors use google.rpc codes: NOT_FOUND, PERMISSION_DENIED, FAILED_PRECONDITION, INVALID_ARGUMENT, RESOURCE_EXHAUSTED (a daily or hourly limit was reached).

Running Neutra

Runs on Cloudflare Workers with D1, based on Cloudflare's remote-mcp-google-oauth template. Every push to main is type-checked, tested and deployed by GitHub Actions (.github/workflows/deploy.yml); migrations in migrations/ are applied before each deploy. Changes go through pull requests.

Setup (done once)

Cloudflare

  • Account ID and the MCP_RESOURCE address are in wrangler.jsonc. The domain neutra.day is attached to the Worker as a Custom Domain in the Cloudflare dashboard.
  • API token: "Edit Cloudflare Workers" template plus D1: Edit.
  • The D1 database (EU jurisdiction) and the OAUTH_KV namespace were created once with wrangler d1 create neutra --jurisdiction eu and wrangler kv namespace create OAUTH_KV; their IDs are in wrangler.jsonc.

Google Cloud (project neutra)

  • Google Auth Platform: audience External, publishing status In production (testing mode makes refresh tokens expire after 7 days). Branding: home page and privacy links above, authorized domain neutra.day.
  • Web client with redirect URI https://neutra.day/callback, used by both the connector sign-in and the browser answer page (add https://developers.google.com/oauthplayground only while making a new inviter key, and http://localhost:8788/callback for local dev).
  • Google Calendar API and Gmail API enabled.
  • Sign-in asks only for email and profile. While ACCESS_MODE is allowlist, only ALLOWED_EMAILS can sign in.

Inviter ([email protected])

  • Refresh token with scopes calendar.events and gmail.send, obtained via the OAuth 2.0 Playground using the web client's own credentials (steps in docs/RUNBOOK.md).

GitHub secrets (Settings → Secrets and variables → Actions)

SecretWhat
CLOUDFLARE_API_TOKENCloudflare API token
GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRETWeb client
COOKIE_ENCRYPTION_KEYAny long random string
ALLOWED_EMAILSComma-separated emails of the test users
INVITER_REFRESH_TOKENInviter's refresh token

Local development

npm install, copy .dev.vars.example to .dev.vars and fill it in, then npm run dev. Test with npx @modelcontextprotocol/inspector@latest against http://localhost:8788/mcp.

License

MIT, see LICENSE. Includes code from Cloudflare's MIT-licensed templates.

Source: README.md at commit b082232

Tools

0
This server asks you to sign in, so SourceWeft could not read its tools without an account and has not indexed them. What a connected account sees can depend on that account and its permissions.

Version history

1
  1. v0.2.0LatestNov 6, 2026

Score

75% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 daysRequired25 pts
  • Auth declaredRequired10 pts
  • Tools listed15 pts

    Answer tools/list without a credential, or ship a package that starts in a sandbox without one.

  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts

    Declare a license in the repository or the registry entry.