sds-mcp-server
MCP server that lets users search Safety Data Sheets (SDS) by chemical or product name, returning records with direct links to SDS documents.
README
sds-mcp-server
An MCP server that lets Claude (or any MCP client) search for Safety Data Sheets (SDS) by chemical or product name, using chemicalsafety.com's SDS search.
Tools
search_sds_by_name
Search for SDS records by chemical or product name.
| Argument | Type | Default | Description |
|---|---|---|---|
chemical_name |
string | — | Chemical or product name to search for, e.g. "Acetone" |
is_contains |
bool | false |
Match names containing the text instead of requiring an exact match (useful for misspelled or partial names) |
limit |
int | 25 |
Max results to return (common chemicals can return 100+ matches) |
Returns a list of records with id, product_name, manufacturer, cas_number,
msds_number, revision_date, has_sds, and sds_url (a direct link to the SDS
document, usually a PDF).
Synonym matching (IncludeSynonyms) is intentionally not exposed — it's the source
endpoint's slowest query mode and was the main cause of Claude Science's local-connector
calls stalling past its response-latency comfort zone, with no real benefit for named
chemicals. is_contains covers the useful "fuzzy match" case within normal response
times.
Setup
python3 -m venv .venv
source .venv/bin/activate
pip install -e .
Using with Claude Code
Copy .mcp.json.example to .mcp.json and update the paths to point at this repo's
.venv/bin/python3 and server.py:
cp .mcp.json.example .mcp.json
Then edit the paths inside, restart Claude Code in this directory, and approve the project MCP server when prompted.
Using with Claude Science
Claude Science connects to local MCP servers via a custom connector, which runs under a
macOS sandbox (sandbox-exec) with restricted process execution, filesystem access, and
network access. Getting this working needs both a sandbox exception (below) and the
connector itself.
1. Allow this repo through the sandbox
Claude Science reads optional settings from ~/.claude-science/config.toml (create the
file if it doesn't exist — it's not created by default). Add this repo's path to
[sandbox] user_read_paths so the sandbox permits reading server.py and its
dependencies, and add chemicalsafety.com to [sandbox.network] allowed_domains so the
sandboxed process can actually reach the search endpoint:
[sandbox]
user_read_paths = [
"/Users/you/sds-mcp-server",
]
[sandbox.network]
allowed_domains = [
"chemicalsafety.com",
]
This file is only read at startup, so restart Claude Science after editing it. See
the configuration file reference
for the full set of config.toml keys.
2. Add the connector
- Run the setup steps above so
.venv/exists with dependencies installed in this repo. - In Claude Science, go to Settings > Connectors > Add connector > Local command.
- Fill in:
-
Name:
sds-lookup -
Command (single field, the whole command line): the absolute path to this repo's venv Python interpreter, including its version number, followed by the absolute path to
server.py, e.g./Users/you/sds-mcp-server/.venv/bin/python3.14 /Users/you/sds-mcp-server/server.pyRun
ls .venv/bin | grep python3\\.to find your exact interpreter name (e.g.python3.14). Using the unversionedpythonorpython3symlink instead fails withsandbox-exec: execvp() of '.../.venv/bin/python' failed: Operation not permitted— the sandbox's exec check doesn't resolve the extra symlink hop those names add, but the version-numbered binary resolves directly and is covered by theuser_read_pathsgrant from step 1.
-
- Click Add, then approve the
search_sds_by_nametool when Claude first tries to use it (or set it to Always allow on the connector's page under Tools).
No PYTHONPATH or system-Python juggling needed — once the repo is in
user_read_paths, the sandbox can execute the venv's own interpreter directly, and it
already knows where its own site-packages are.
Notes
The chemicalsafety.com search endpoint is undocumented and returns 403 unless the
request includes browser-like User-Agent, Origin, and Referer headers — this is
already handled in sds_search.py.
Roadmap
Not yet implemented:
- Search by CAS number
- Filter by manufacturer
- Fetch and extract full SDS document content (most links are PDFs)
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.
E2B
Using MCP to run code via e2b.