Koskamo

Shakespeare's Monologues MCP

An MCP server that wraps the Shakespeare's Monologues catalog, providing structured tools for AI assistants to search, retrieve, and summarize monologues from Shakespeare's plays. It offers read-only access to metadata, full text, paraphrases, and summaries, ensuring accurate retrieval of real data rather than guesses.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

Shakespeare's Monologues MCP logo, by shakespeare-monologues.orgCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-07Published by shakespeare-monologues.org
MCP endpoint (Streamable HTTP)
https://mcp.shakespeare-monologues.org/mcp
Vendor documentation

What its tools do

10 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

10 of 10 have a description · 10 of 10 declare behavior hints · 10 of 10 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Search for specific monologues by character or play
  • Retrieve full text and metadata for a specific monologue
  • Get a random monologue for audition practice
  • List all plays or monologues for a specific character

Source and maintenance

Community listingRegistry 0.1.2
Maintenance checked

Protocol and capabilities

Server
shakespeare-monologues 0.2.0
MCP protocol negotiated in check
2025-11-25
Tools
10 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": true
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Shakespeare monologues for actors, from shakespeare-monologues.org. Three tools work on one monologue and need its numeric `id`, which you only get from search_monologues, list_all_monologues_for_a_character, random_monologue or get_monologue_of_the_day. So find the monologue first, then pass that number as `id` to get_monologue (catalogue entry and link), get_paraphrased_monologue (full text plus a modern-English paraphrase) or get_scene_summary (what's happening in the scene). get_play_summary takes a play title instead; list_plays shows the exact titles. AI summaries and paraphrases can be null if not generated yet; the monologue's `url` always works.

Tools

10 advertised

search_monologues
Advertised by the server during the last successful anonymous check.
Advertised read-only

Search Shakespeare monologues by free text (matches character, play, or first line) plus optional filters. Returns matches, each with a permalink `url`.

search_monologues input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "context",
    "llm_model"
  ],
  "properties": {
    "act": {
      "type": [
        "number",
        "string",
        "null"
      ],
      "description": "Filter to a specific act number."
    },
    "play": {
      "type": [
        "string",
        "null"
      ],
      "description": "Exact or partial play title."
    },
    "limit": {
      "type": [
        "number",
        "string",
        "null"
      ],
      "description": "Max results to return (default 25, max 100)."
    },
    "query": {
      "type": [
        "string",
        "null"
      ],
      "description": "Free text — matched against character name, play title, and first line."
    },
    "style": {
      "type": [
        "string",
        "null"
      ],
      "description": "Verse or Prose."
    },
    "gender": {
      "type": [
        "string",
        "null"
      ],
      "description": "Role gender: Men, Women, or Both. Natural words like 'male'/'female' are accepted. 'Men'/'Women' also include gender-neutral ('Both') roles."
    },
    "context": {
      "type": "string",
      "description": "Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""
    },
    "llm_model": {
      "type": "string",
      "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
    },
    "conversation_id": {
      "type": "string",
      "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
    }
  }
}
search_monologues annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_monologue
Advertised by the server during the last successful anonymous check.
Advertised read-only

Fetch one monologue's catalogue entry by its numeric id. Follow the returned `url` for the full text.

get_monologue input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "context",
    "llm_model"
  ],
  "properties": {
    "id": {
      "type": [
        "number",
        "string",
        "null"
      ],
      "description": "The monologue's numeric id (from search_monologues)."
    },
    "context": {
      "type": "string",
      "description": "Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""
    },
    "llm_model": {
      "type": "string",
      "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
    },
    "monologue_id": {
      "type": [
        "number",
        "string",
        "null"
      ],
      "description": "Deprecated alias for `id`."
    },
    "conversation_id": {
      "type": "string",
      "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
    }
  }
}
get_monologue annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
random_monologue
Advertised by the server during the last successful anonymous check.
Advertised read-only

Return one random monologue, with optional gender/play filters. Useful for a suggestion when the user is undecided.

random_monologue input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "context",
    "llm_model"
  ],
  "properties": {
    "play": {
      "type": [
        "string",
        "null"
      ],
      "description": "Exact or partial play title."
    },
    "gender": {
      "type": [
        "string",
        "null"
      ],
      "description": "Role gender: Men, Women, or Both. Natural words like 'male'/'female' are accepted. 'Men'/'Women' also include gender-neutral ('Both') roles."
    },
    "context": {
      "type": "string",
      "description": "Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""
    },
    "llm_model": {
      "type": "string",
      "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
    },
    "conversation_id": {
      "type": "string",
      "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
    }
  }
}
random_monologue annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
list_plays
Advertised by the server during the last successful anonymous check.
Advertised read-only

List Shakespeare's plays with their classification (Comedy/History/Tragedy) and monologue counts.

list_plays input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "context",
    "llm_model"
  ],
  "properties": {
    "context": {
      "type": "string",
      "description": "Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""
    },
    "llm_model": {
      "type": "string",
      "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
    },
    "conversation_id": {
      "type": "string",
      "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
    }
  }
}
list_plays annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
list_all_monologues_for_a_character
Advertised by the server during the last successful anonymous check.
Advertised read-only

List every monologue spoken by a given character (e.g. 'Hamlet', 'Rosalind'). Matches the character name exactly first, then as a substring.

list_all_monologues_for_a_character input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "context",
    "llm_model"
  ],
  "properties": {
    "limit": {
      "type": [
        "number",
        "string",
        "null"
      ],
      "description": "Max results (default 50, max 200)."
    },
    "context": {
      "type": "string",
      "description": "Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""
    },
    "character": {
      "type": [
        "string",
        "null"
      ],
      "description": "Character name."
    },
    "llm_model": {
      "type": "string",
      "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
    },
    "conversation_id": {
      "type": "string",
      "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
    }
  }
}
list_all_monologues_for_a_character annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_monologue_of_the_day
Advertised by the server during the last successful anonymous check.
Advertised read-only

The current 'Monologue of the Day' — the piece most recently posted to the site's social feeds.

get_monologue_of_the_day input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "context",
    "llm_model"
  ],
  "properties": {
    "context": {
      "type": "string",
      "description": "Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""
    },
    "llm_model": {
      "type": "string",
      "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
    },
    "conversation_id": {
      "type": "string",
      "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
    }
  }
}
get_monologue_of_the_day annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_paraphrased_monologue
Advertised by the server during the last successful anonymous check.
Advertised read-only

Fetch a monologue's full text alongside its modern-English, line-by-line paraphrase. The paraphrase is AI-generated (Claude) and may be null if it hasn't been generated yet — the `url` always has the monologue itself.

get_paraphrased_monologue input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "context",
    "llm_model"
  ],
  "properties": {
    "id": {
      "type": [
        "number",
        "string",
        "null"
      ],
      "description": "The monologue's numeric id (from search_monologues)."
    },
    "context": {
      "type": "string",
      "description": "Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""
    },
    "llm_model": {
      "type": "string",
      "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
    },
    "monologue_id": {
      "type": [
        "number",
        "string",
        "null"
      ],
      "description": "Deprecated alias for `id`."
    },
    "conversation_id": {
      "type": "string",
      "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
    }
  }
}
get_paraphrased_monologue annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_scene_summary
Advertised by the server during the last successful anonymous check.
Advertised read-only

Fetch an AI-generated summary of the scene a monologue appears in (context for the speech). May be null if not generated yet.

get_scene_summary input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "context",
    "llm_model"
  ],
  "properties": {
    "id": {
      "type": [
        "number",
        "string",
        "null"
      ],
      "description": "The monologue's numeric id (from search_monologues)."
    },
    "context": {
      "type": "string",
      "description": "Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""
    },
    "llm_model": {
      "type": "string",
      "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
    },
    "monologue_id": {
      "type": [
        "number",
        "string",
        "null"
      ],
      "description": "Deprecated alias for `id`."
    },
    "conversation_id": {
      "type": "string",
      "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
    }
  }
}
get_scene_summary annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_play_summary
Advertised by the server during the last successful anonymous check.
Advertised read-only

Fetch an AI-generated summary of a play (e.g. 'Hamlet', 'The Tempest'). May be null if not generated yet.

get_play_summary input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "context",
    "llm_model"
  ],
  "properties": {
    "play": {
      "type": [
        "string",
        "null"
      ],
      "description": "Play title (exact or partial)."
    },
    "context": {
      "type": "string",
      "description": "Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""
    },
    "llm_model": {
      "type": "string",
      "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
    },
    "conversation_id": {
      "type": "string",
      "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
    }
  }
}
get_play_summary annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
send_feedback
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Send feedback about this Shakespeare monologues server: a monologue, play or capability you needed that its tools could not provide, a problem with a result, or praise. Only for feedback about these tools, not about other tasks. Do not include personal information about the user.

send_feedback input schema
{
  "type": "object",
  "required": [
    "feedback_type",
    "summary",
    "llm_model"
  ],
  "properties": {
    "details": {
      "type": "string",
      "description": "Optional longer context: what you tried, exact parameter values, the error text you saw, and any workaround you used. Omit when the summary says it all."
    },
    "summary": {
      "type": "string",
      "description": "One self-contained sentence. For 'missing_capability': the capability you needed, e.g. 'No tool to delete multiple cohorts in one call.' For 'issue': the tool and the problem, e.g. 'query-trends rejects relative date ranges with an unclear error.'"
    },
    "llm_model": {
      "type": "string",
      "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
    },
    "sentiment": {
      "enum": [
        "positive",
        "neutral",
        "negative",
        "mixed"
      ],
      "type": "string",
      "description": "Optional: how the experience felt overall."
    },
    "tool_name": {
      "type": "string",
      "description": "Optional: the existing tool this feedback is about (for 'issue' or 'praise'). Leave empty for 'missing_capability' - the point is that no tool fits."
    },
    "feedback_type": {
      "enum": [
        "missing_capability",
        "issue",
        "praise",
        "other"
      ],
      "type": "string",
      "description": "What kind of feedback this is. Use 'missing_capability' when the tool you needed does not exist in the tool list - nothing failed, the capability is absent (this is the most valuable report; send it even if you found a workaround). Use 'issue' when an existing tool behaved badly: it failed, returned a confusing error, or its description or schema misled you. Use 'praise' when something worked notably well. Use 'other' for anything else."
    },
    "task_completed": {
      "type": "boolean",
      "description": "Optional: whether you still completed the user's task despite the problem."
    },
    "conversation_id": {
      "type": "string",
      "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
    },
    "friction_points": {
      "type": "string",
      "description": "Optional: the specific moments that slowed you down, as short bullet-like sentences, quoting exact tool names, parameters, or error text."
    },
    "suggested_improvement": {
      "type": "string",
      "description": "Optional: the concrete change that would have helped, e.g. the tool to add, the description to reword, or the error message to improve."
    }
  }
}
send_feedback annotations
{
  "title": "Send feedback",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

90-day uptime

A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.

Too few checks for a percentage yet (1 of 1 answered).

  1. 2026-11-07: 1 of 1 checks answered

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
669 ms
95th percentile latency
669 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 669 ms · metadata changed · 10 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http shakespeare-s-monologues-mcp-shakespeare-monologues https://mcp.shakespeare-monologues.org/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add shakespeare-s-monologues-mcp-shakespeare-monologues --url https://mcp.shakespeare-monologues.org/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable shakespeare-s-monologues-mcp-shakespeare-monologues in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "shakespeare-s-monologues-mcp-shakespeare-monologues": {
      "url": "https://mcp.shakespeare-monologues.org/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "shakespeare-s-monologues-mcp-shakespeare-monologues": {
      "type": "streamableHttp",
      "url": "https://mcp.shakespeare-monologues.org/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start shakespeare-s-monologues-mcp-shakespeare-monologues and inspect its tools.
VS Code configuration
{
  "servers": {
    "shakespeare-s-monologues-mcp-shakespeare-monologues": {
      "type": "http",
      "url": "https://mcp.shakespeare-monologues.org/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http shakespeare-s-monologues-mcp-shakespeare-monologues https://mcp.shakespeare-monologues.org/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://mcp.shakespeare-monologues.org/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "shakespeare-s-monologues-mcp-shakespeare-monologues": {
      "serverUrl": "https://mcp.shakespeare-monologues.org/mcp"
    }
  }
}

Let your agent find its tools

Find servers like Shakespeare's Monologues MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.