mcp-template
Provides tools for interacting with Gmail, enabling email management and automation.
Click on "Install 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., "@mcp-templateshow my recent unread emails from Gmail"
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.
custom-mcps
Agent Prompt
Copy and paste this into your AI coding agent (Claude Code, Cursor, Copilot, etc.) to install:
Install the CLI and download the gmail-mcp skill:
uv tool install custom-mcps
curl -fsSL https://raw.githubusercontent.com/Edison-Watch/Custom-MCPs/main/scripts/install-skills.sh -o install-skills.sh
bash install-skills.sh && rm install-skills.shThe official gmail-mcp agent skill is self-published on skills.sh. Install it directly with:
npx skills add Edison-Watch/Custom-MCPsThe skill's source of truth lives in skills/gmail-mcp/SKILL.md;
make sync-skills mirrors it to the landing page's
/.well-known/agent-skills/ discovery tree (digest-pinned in index.json).
Related MCP server: MCP Template
App Distribution
MCP server with OAuth
Claude and ChatGPT connectors
APIs and SDKs
Chat interfaces like iMessage and WhatsApp
A dashboard that uses the same MCP layer
Open source
Key Features
Feature | Stack |
CLI (auto-discovery commands, global flags, shell completions, self-update) | Typer |
MCP server (streamable HTTP at | FastMCP |
HTTP API server (also hosts | FastAPI + Uvicorn |
Auth | WorkOS + API keys |
Payments | Stripe |
Database + migrations | SQLAlchemy + Alembic |
Config (YAML + | Pydantic-settings |
LLM inference + observability | DSPY + LiteLLM + LangFuse |
Testing | pytest + |
Lint / type / dead-code | Ruff + Vulture + ty + import-linter |
Pre-commit (folder size, ai-writing, agent-config sync) | prek |
Telemetry | Anonymous, opt-out |
Architecture
One codebase, three interfaces. Write business logic once in services/ and it ships as a CLI subcommand, an MCP tool, and an HTTP route - same Pydantic input/output contract everywhere.
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ src/cli/app │ │ mcp_server/ │ │ api_server/ │ transport / interface
│ (Typer) │ │ (FastMCP) │ │ (FastAPI) │
└──────┬───────┘ └──────┬───────┘ └──────┬───────┘
│ │ │
└─────────────────┼─────────────────┘
▼
┌───────────────┐
│ services/ │ pure @service functions
│ @service │ (transport-agnostic)
└───────┬───────┘
▼
┌───────────────┐
│ models/ │ Pydantic I/O contracts
└───────┬───────┘
▼
┌────────────┬───────┬────────────┬─────────────┐
│ common/ │ db/ │ utils/llm/ │ src/utils/ │ shared infra
│ (config) │ (ORM) │ (DSPY) │ (logs/theme)│
└────────────┴───────┴────────────┴─────────────┘MCP UI (optional)
Need elicitation, image output, or an iframe dashboard for an MCP tool? Add an opt-in enhancer in mcp_server/enhancers/. Enhancers wrap a service for the MCP transport only - the pure service stays untouched and CLI/API consumers are unaffected.
See mcp_server/MCP_UI_ARCHITECTURE.md for the full design.
Quick Start
uv sync # install deps
uv run edisonmcps --help # see all CLI commands
uv run edisonmcps greet Alice # run a command
uv run edisonmcps init my_command # scaffold a new command
uv run edisonmcps-serve # start the server (HTTP API + MCP at /mcp on one port)
uv run edisonmcps-mcp # legacy: stdio MCP only, for local Claude Desktop / devDeploy
One-click deploy to Railway or Render (backend + managed Postgres, migrations run automatically). See deployment docs for the per-platform setup, the Railway template variable map, and OAuth/secret wiring.
CLI Usage
Global flags go before the subcommand:
Flag | Short | Description |
|
| Increase output verbosity |
|
| Suppress non-essential output |
| Show full tracebacks on error | |
|
| Output format: |
| Preview actions without executing | |
|
| Print version and exit |
uv run edisonmcps --format json config show # JSON output
uv run edisonmcps --dry-run greet Bob # preview without executing
uv run edisonmcps --verbose greet Alice # detailed outputAdding Commands
Drop a Python file in src/cli/commands/ and it is auto-discovered.
Single command - export a main() function:
# src/cli/commands/hello.py
from typing import Annotated
import typer
def main(name: Annotated[str, typer.Argument(help="Who to greet.")]) -> None:
"""Say hello."""
typer.echo(f"Hello, {name}!")uv run edisonmcps hello World # Hello, World!Subcommand group - export app = typer.Typer():
# src/cli/commands/db.py
import typer
app = typer.Typer()
@app.command()
def migrate() -> None:
"""Run migrations."""
...uv run edisonmcps db migrateOr scaffold with: uv run edisonmcps init my_command --desc "Does something".
Configuration
from common import global_config
# Access config values from common/global_config.yaml
global_config.example_parent.example_child
# Access secrets from .env
global_config.OPENAI_API_KEYCLI config inspection:
uv run edisonmcps config show # full config
uv run edisonmcps config get llm_config.cache_enabled # single value
uv run edisonmcps config set logging.verbose false # write overrideCredits
This software uses the following tools:
About the Core Contributors
Made with contrib.rocks.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/Edison-Watch/Custom-MCPs'
If you have feedback or need assistance with the MCP directory API, please join our Discord server