Skip to main content
Glama
slshults

shakespeare-monologues-mcp

README.md
# Shakespeare's Monologues — MCP server

A small, read-only [Model Context Protocol](https://modelcontextprotocol.io) server
that lets MCP-capable AI clients search and fetch Shakespeare monologue metadata from
[shakespeare-monologues.org](https://www.shakespeare-monologues.org).

It's a **thin, stateless wrapper** over the site's public JSON index
(`/api/monologues.json`) — no database, no secrets. Every result carries the
monologue's permalink `url` (where the full text, scene context, and modern-English
paraphrase live) and an attribution note.

## Tools

| Tool | What it does |
| --- | --- |
| `search_monologues` | Free-text search (character / play / first line) + filters: `gender`, `play`, `style`, `act`, `limit`. |
| `get_monologue` | One monologue's index entry by numeric `id`. |
| `random_monologue` | A random monologue, optional `gender` / `play` filters. |
| `list_plays` | Every play with its classification and monologue count. |
| `list_all_monologues_for_a_character` | Every monologue spoken by a named character. |
| `get_monologue_of_the_day` | The current Monologue of the Day (latest social post). |
| `get_paraphrased_monologue` | A monologue's full text + its modern-English paraphrase (AI-generated; may be null if not yet generated). |
| `get_scene_summary` | AI-generated summary of the scene a monologue is in (by monologue id). |
| `get_play_summary` | AI-generated summary of a play (by title). |

> The paraphrase and summaries are AI-generated (Claude) and only partially cached so far,
> so those tools return `null` where content hasn't been generated yet.

## Run locally

Two transports, same tools. `server.ts` builds the tool surface and knows
nothing about how it's reached; `index.ts` serves it over HTTP and `stdio.ts`
over stdio.

**Over stdio**, the way an MCP client spawns a local server:

```bash
npx shakespeare-monologues-mcp
```

**Over HTTP**, which is how the hosted instance runs:

```bash
npm install
npm run build
npm start          # listens on :3000, POST /mcp   (set PORT to change)
```

Health check: `GET /health` → `{"ok":true}`.

Neither mode needs credentials — the server reads the site's public JSON index.
Set `MONOLOGUES_API_URL` to point it elsewhere, and `POSTHOG_PROJECT_API_KEY=""`
to disable analytics.

## Connecting a client

Remote MCP means users add a **URL**, no install. In a client that supports remote /
custom MCP servers (Claude Desktop connectors, etc.), add:

```
https://mcp.shakespeare-monologues.org/mcp
```

Or run it yourself over stdio, with no hosted dependency:

```json
{
  "mcpServers": {
    "shakespeare-monologues": {
      "command": "npx",
      "args": ["-y", "shakespeare-monologues-mcp"]
    }
  }
}
```

For clients configured with a JSON config file, use the streamable-HTTP transport:

```json
{
  "mcpServers": {
    "shakespeare-monologues": {
      "type": "streamable-http",
      "url": "https://mcp.shakespeare-monologues.org/mcp"
    }
  }
}
```

For a client that only speaks stdio, bridge to the remote server with
[`mcp-remote`](https://www.npmjs.com/package/mcp-remote):

```json
{
  "mcpServers": {
    "shakespeare-monologues": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://mcp.shakespeare-monologues.org/mcp"]
    }
  }
}
```

> Note on "autonomous" use: there's no mechanism today for an arbitrary agent to
> discover and use this with zero user action — a client/platform still has to connect
> it. For truly zero-setup access, agents can hit the plain JSON API
> (`/api/monologues.json`) and `/llms.txt` directly.

## License

- **Code:** MIT.
- **Data** served through it: © shakespeare-monologues.org, **CC BY-NC-SA 4.0** — please
  keep the attribution that each tool response includes.

---

[![shakespeare-monologues-mcp MCP server](https://glama.ai/mcp/servers/slshults/shakespeare-monologues-mcp/badges/score.svg)](https://glama.ai/mcp/servers/slshults/shakespeare-monologues-mcp)

TDQS

A4/5.0

Scored across 9 tools

Disambiguation4/5

Each tool targets a distinct retrieval or summary function, and the descriptions generally clarify boundaries. The main ambiguity is between search_monologues and list_all_monologues_for_a_character, since both can return monologues for a character, though one is a broad search and the other a focused listing.

Naming Consistency4/5

Most tools follow a clear snake_case verb_noun pattern like list_plays, search_monologues, and get_monologue. random_monologue breaks the verb-first convention, and a few names are verbose, but the overall style remains predictable.

Tool Count5/5

Nine tools is well-scoped for a Shakespeare monologue server, covering browsing, searching, retrieval, random/daily selection, paraphrases, and summaries. Each tool earns its place without feeling bloated or redundant.

Completeness4/5

The surface covers the core workflows of discovering, searching, retrieving, and contextualizing monologues. Minor gaps exist, such as no direct list-monologues-by-play endpoint and get_monologue requiring an external URL for the full text, but agents can work around these.

Maintenance

ActivityMaintained
ResponsivenessNo issues