mcp101
Allows listing the user's GitHub repositories and fetching user profile information after OAuth authentication.
Allows reading the user's Google Calendar events (read-only) after OAuth authentication, via the Calendar API.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mcp101 List my Google calendars"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
mcp101
A hands-on sample MCP server built with FastMCP, used to try out the Model Context Protocol — basic tools first, then a real-world Google OAuth example that calls Google APIs on a user's behalf.
It accompanies the MCP Tooling learning note.
Layout
File | What it is |
| Minimal no-auth server — |
| Google OAuth server — authenticates the user with Google and lists their calendars via the Calendar API. |
| GitHub OAuth server — authenticates the user with GitHub and lists their repos. Quickest auth demo to set up. |
Related MCP server: Google-Workspace-MCP-Server
Requirements
Quick start (no auth)
just install # or: uv sync
just run # stdio transport, for Claude Desktop / Cursor
just run-http # streamable HTTP on http://localhost:8000/mcpTest it visually with the MCP Inspector:
just inspect # npx @modelcontextprotocol/inspector uv run mcp101Wire it into Claude Desktop (claude_desktop_config.json):
{
"mcpServers": {
"mcp101": {
"command": "uv",
"args": ["run", "--directory", "/absolute/path/to/mcp101", "mcp101"]
}
}
}Google OAuth demo
This is the part worth understanding: it does not just log you in, it acts as
you against Google. FastMCP's GoogleProvider is an OAuthProxy (Google has no
Dynamic Client Registration), so FastMCP brokers the OAuth flow, encrypts and
stores the upstream Google token server-side, and hands the MCP client only a
reference token. Inside a tool, get_access_token().token gives you the real
Google access token to call Google with — and the proxy refreshes it transparently.
1. Create Google credentials
Google Cloud Console → APIs & Services → OAuth consent screen — configure it (External; add yourself as a test user while in "Testing" mode).
APIs & Services → Credentials → Create Credentials → OAuth client ID → application type Web application.
Add an Authorized redirect URI that matches exactly:
http://localhost:8000/auth/callback.APIs & Services → Library → enable Google Calendar API.
Copy the Client ID (
...apps.googleusercontent.com) and Client Secret (GOCSPX-...).
2. Configure and run
cp .env.example .env # then fill in the two Google values
set -a; source .env; set +a
just run-google # or: uv run mcp101-googleConnect with the Inspector (HTTP transport, URL http://localhost:8000/mcp). It
will bounce you through Google's consent screen, then whoami and list_calendars
will work.
Scopes
Requested in google_server.py:
openid,.../auth/userinfo.email— identity.../auth/calendar.readonly— read the user's calendars
Prefer .readonly scopes unless you need write access.
Gotchas
Restricted scopes (Gmail, Drive contents) need Google's app-verification review for non-test users. In "Testing" mode you are limited to explicitly added test users.
Tokens are per-user and in-memory in this demo. For production, configure persistent encrypted token storage and stable JWT signing keys, or tokens die on restart and everyone re-consents.
The redirect URI must match exactly between Google and
BASE_URL— a trailing slash mismatch will fail the flow.
GitHub OAuth demo
The same OAuthProxy mechanics as the Google demo, but a GitHub OAuth App takes a minute to create and needs no verification review — so this is the fastest way to see real on-behalf-of-user API calls.
1. Create a GitHub OAuth App
GitHub → Settings → Developer settings → OAuth Apps → New OAuth App.
Homepage URL:
http://localhost:8000.Authorization callback URL (must match exactly):
http://localhost:8000/auth/callback.Register, then Generate a new client secret. Copy the Client ID (
Iv1...) and secret.
2. Configure and run
cp .env.example .env # fill in the two GITHUB_ values
set -a; source .env; set +a
just run-github # or: uv run mcp101-githubConnect with the Inspector (Streamable HTTP, URL http://localhost:8000/mcp). After
the GitHub consent screen, whoami returns your profile and list_repos lists your
repositories.
Requested scopes (in github_server.py): read:user, user:email, public_repo.
Docker
The image defaults to the basic server over streamable HTTP — sensible for a container / Kubernetes deployment (stdio only makes sense for local desktop clients).
docker build -t mcp101 .
docker run --rm -p 8000:8000 mcp101 # basic server on :8000/mcpRun the Google demo instead by overriding the command and passing credentials:
docker run --rm -p 8000:8000 \
-e GOOGLE_CLIENT_ID=...apps.googleusercontent.com \
-e GOOGLE_CLIENT_SECRET=GOCSPX-... \
-e BASE_URL=https://your-public-host \
mcp101 mcp101-googleFor Kubernetes, expose port 8000, set BASE_URL to the externally reachable URL,
and remember the Google Authorized redirect URI must be <BASE_URL>/auth/callback.
For anything beyond a demo, also configure persistent encrypted token storage and
stable JWT signing keys (see the gotchas above).
CI
.github/workflows/ci.yaml runs on every push/PR to main:
ruff format --checkandruff check(lint)an import smoke test for both servers
a
docker buildto validate the image
License
MIT
Available Tools
2 toolsTool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 2 tools
The two tools serve entirely different purposes—arithmetic and greeting—so there is no risk of confusion or overlap.
Both tool names are single verbs in imperative form, following a consistent and predictable pattern.
With only 2 tools, the server is on the lower end of the appropriate range; it feels thin but not unreasonable for a small utility server.
The tools cover two unrelated capabilities with no clear domain, leaving significant gaps for any coherent purpose beyond these trivial operations.
Related MCP Connectors
A MCP server that works with Google Calendar to manage event listing, reading, and updates.
Streamable HTTP MCP server for Google Calendar and Sheets with OAuth login.
Hosted MCP server with managed OAuth for 15+ toolkits: Google Workspace, Fitbit, Oura, Kalshi, etc.
Hosted Google Calendar MCP server for AI agents. No self-hosting or Google Cloud setup.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceMCP Server for Google Services, with the ability to define your own scopes and bring your own oauth key.3MIT
- AlicenseNot gradedqualityDmaintenanceMCP server that seamlessly interacts with your Google Calendar, Gmail, Drive and so on.30MIT
- FlicenseNot gradedqualityDmaintenanceAn MCP server that provides integration with Google Calendar, allowing users to list calendars and manage events. It enables searching, creating, and modifying calendar entries through tools designed for the Model Context Protocol.-
- AlicenseNot gradedqualityDmaintenanceMCP server to interact with Google Gmail and Calendar APIs. Supports multiple accounts, email search and drafting, and calendar event management.MIT