Find rhymes, synonyms, sound-alikes, spelling matches, and word associations with Datamuse.
Find rhymes, synonyms, sound-alikes, spelling matches, and word associations with Datamuse via MCP. STDIO or Streamable HTTP.
Word finding for writing, editing, puzzles, and naming, powered by the Datamuse API. Find a rhyme with a particular meaning, explore lexical alternatives, or combine meaning, sound, spelling, and relation constraints.
| Tool | Description |
|---|---|
datamuse_find_rhymes | Find exact or near rhymes, optionally constrained by meaning and spelling |
datamuse_find_synonyms | Find synonyms, antonyms, broader categories, or narrower kinds |
datamuse_find_words | Combine meaning, sound, spelling, and named lexical relations, with context and topic hints |
datamuse_list_reference | Read offline guidance on relations, metadata, combinations, and service limitations |
datamuse_get_word_info | Look up raw metadata for supplied spellings, with indexed partial outcomes |
datamuse_find_rhymes toolword; rhyme_type is exact (default) or near, never blended; optional means_like and spelled_like narrow the same search. English onlylimit (default 20), offset (default 0), include_definitions, include_pronunciation, and include_ipa (metadata options default false). Rows carry whatever metadata Datamuse suppliesdatamuse_find_synonyms toolword; relation is synonyms (default), antonyms, broader (direct hypernyms), or narrower (direct hyponyms). English onlyassociated relation of datamuse_find_wordsdatamuse_find_words toolmeans_like, sounds_like, spelled_like (upstream spelling patterns), or up to 14 relations: [{ relation, word }], all conjoined; repeated relations are kept. left_context, right_context, and up to five topics, each a single word, affect ordering onlyexact_rhyme, near_rhyme, synonyms, antonyms, broader, narrower, parts, wholes, nouns_modified_by, adjectives_describing, followers, predecessors, associated, homophones, consonant_match; datamuse_list_reference gives their directionsvocabulary is en (default) or es; Spanish takes meaning, sound, and spelling constraints, not relations. Rejections are typed: missing_constraint, unsupported_vocabulary_relation, invalid_context_hintSpelling patterns are interpreted by Datamuse using supported OneLook syntax:
| Pattern | Meaning |
|---|---|
*, ? | Any length, or one character |
//listen | Anagrams, including phrases such as lets in |
c@t, s#@p | @ matches one English vowel including y; # one consonant |
*+abc | Restrict letters to a, b, c; repetitions and spaces can occur |
b????-e | Five-character pattern excluding e |
hipopatamus | Similar spellings without wildcard syntax |
For anagrams, call datamuse_find_words with {"spelled_like":"//listen"}. +letters restricts allowed letters and -letters excludes them; neither requires every listed letter.
datamuse_get_word_info toolSupply 1–100 nonblank words, each at most 200 characters. The first ten are processed sequentially through the shared request budget; later entries return processing_cap. One 20-second deadline includes all requests, retries and pacing. Completed results survive item failures; pending entries return deadline_exceeded. Caller cancellation stops the call.
The same include_definitions, include_pronunciation, and include_ipa options apply. Each indexed outcome contains trimmed caller input and either a complete raw row, a failure reason with recovery, or an unprocessed reason. Only a query-tagged echo matching the supplied spelling under Unicode lowercase is accepted: Ice Cream can return raw row.word='ice cream', while corrections are never substituted. Missing metadata stays absent, and duplicates keep their indices. Lookup output is complete on both MCP surfaces and has no search byte slicing.
datamuse_list_reference tooltopic is all (default), relations, metadata, combinations, or limitationssections: [{ topic, text }] without a network requestBuilt on @cyanheads/mcp-ts-core: stdio and Streamable HTTP transports, pluggable auth (none / jwt / oauth), swappable storage (in-memory, filesystem, Supabase, Cloudflare KV/R2/D1), structured logging with optional OpenTelemetry tracing.
Datamuse-specific:
/words endpoint, with no local mirror or stored queriesf: frequency per million words). They do not establish dictionary completeness or poetic suitabilityAgent-friendly output:
effectiveQuery, returnedCount, limitReached, and truncated, plus relevant notices and nextOffset. Positive safe-integer limits above 1000 are clamped with requestedLimit and effective limit echoed. Invalid integers reject before I/Ooffset accepts 0–999. Searches fetch max=min(1000, offset+limit) and select complete rows under 64,000 bytes per serialized MCP surface, including escaping and enrichment. A local byte cut sets truncated=true; re-run with offset=nextOffset when supplied. One oversized row is returned intact with a soft-budget notice and offset progress. API-cap notices are separate from byte cuts. Rankings can change between calls, so offsets are best-effort navigation with possible duplicates or gaps, never snapshots, stable pagination, totals, or proof of exhaustion. No continuation beyond index 999means_like or sounds_like; rhyme guidance also suggests explicitly trying the final wordinclude_pronunciation appends r to md; include_ipa implies pronunciation and adds ipa=1. Raw pron: and ipa_pron: tags may both occur. ARPAbet stress digits mean 0 unstressed, 1 primary, 2 secondary; pronunciations may be guessed, sense-dependent, or absentword plus whatever score, numSyllables, tags, defs, defHeadword, and other fields Datamuse sent, unchanged and in upstream order, identical in structuredContent and the fenced JSON text. score ranks results within one query onlyupstream_rate_limited and pacer_shed, with retryAfter), malformed upstream data, and invalid input, each with a recovery hintDatamuse currently documents keyless access up to 100,000 requests per day and asks customer-facing applications to contact it. It has announced manually issued API keys for early 2027, with conflicting dates: January 1 in its usage section and February 1 in its banner. No key format is documented yet, so this server uses the keyless API, and access may be interrupted at the switch.
Queries are sent to Datamuse, which keeps a temporary log of them until the end of the following day. Server payload logging and telemetry are optional; review their settings before sending sensitive text.
Word results and lexical metadata come from Datamuse; see its documentation for data sources and attribution requirements. The Apache-2.0 license covers this server's code, not the upstream data.
Add the following to your MCP client configuration file.
{
"mcpServers": {
"datamuse-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/datamuse-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
Or with npx (no Bun required):
{
"mcpServers": {
"datamuse-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/datamuse-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
Or with Docker:
{
"mcpServers": {
"datamuse-mcp-server": {
"type": "stdio",
"command": "docker",
"args": ["run", "-i", "--rm", "-e", "MCP_TRANSPORT_TYPE=stdio", "ghcr.io/cyanheads/datamuse-mcp-server:latest"]
}
}
}
For Streamable HTTP, set the transport and start the server:
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
# Server listens at http://localhost:3010/mcp
git clone https://github.com/cyanheads/datamuse-mcp-server.git
cd datamuse-mcp-server
bun install
cp .env.example .env
# edit .env for transport, authentication, logging, or telemetry overrides
| Variable | Description | Default |
|---|---|---|
MCP_TRANSPORT_TYPE | Transport: stdio or http. | stdio |
MCP_HTTP_HOST | HTTP bind address. | 127.0.0.1 |
MCP_HTTP_PORT | HTTP server port. | 3010 |
MCP_SESSION_MODE | HTTP session mode: stateless, stateful, or auto. | stateless |
MCP_AUTH_MODE | Authentication: none, jwt, or oauth. | none |
MCP_LOG_LEVEL | Log level (debug, info, warning, error, etc.). | info |
LOGS_DIR | Directory for log files (Node.js only). | <app-root>/logs |
STORAGE_PROVIDER_TYPE | Storage backend: in-memory, filesystem, supabase, cloudflare-kv/r2/d1. | in-memory |
OTEL_ENABLED | Enable OpenTelemetry. | false |
See .env.example for every server setting and the common framework overrides.
Build and run the production version:
# One-time build
bun run rebuild
# Run the built server
bun run start:http
# or
bun run start:stdio
Run checks and tests:
bun run devcheck # Lints, formats, type-checks, and more
bun run test # Runs the test suite
| Directory | Purpose |
|---|---|
src/mcp-server/tools/definitions | Five tool definitions and shared search enrichment. |
src/services/datamuse | Fixed-endpoint client, shared pacing, upstream schemas, and JSON rendering. |
tests/ | Service, tool, and serialization tests. |
docs/ | Surface design and generated directory tree. |
See CLAUDE.md for development guidelines and architectural rules. The short version:
try/catch in tool logicctx.log for logging, ctx.state for storagecreateApp() arrays in src/index.tsIssues are welcome. Run checks and tests before submitting:
bun run devcheck
bun run test
This project is licensed under the Apache 2.0 License. See the LICENSE file for details.
Source-derived launch command. Check the maintainer’s required arguments and credentials before running:
npx -y @cyanheads/datamuse-mcp-serverMerge this template into ~/Library/Application Support/Claude/claude_desktop_config.json. Keep existing servers. Add any arguments, credentials, and permissions required by the maintainer; this template has not been install-tested.
{
"mcpServers": {
"io-github-cyanheads-datamuse-mcp-server": {
"command": "npx",
"args": [
"-y",
"@cyanheads/datamuse-mcp-server"
]
}
}
}Restart Claude Desktop completely for changes to take effect. Confirm the server appears connected in the client’s tool list, then try a read-only example from its documentation.
Claude Desktop setup referenceio.github.cyanheads/datamuse-mcp-server works with any MCP-compatible client. Copy the config snippet from the Configuration section above and add it to the file shown for your client, then restart the application.
~/Library/Application Support/Claude/claude_desktop_config.jsonRestart Claude Desktop completely for changes to take effect.~/.cursor/mcp.jsonRestart Cursor for changes to take effect..vscode/mcp.jsonReload VS Code window for changes to take effect.~/.codeium/windsurf/mcp_config.jsonRestart Windsurf for changes to take effect..mcp.jsonSave at the project root, then start Claude Code in that project and review the MCP server approval prompt. Keep real credentials out of shared files.