Hermes MCP Server
Provides tools for searching, retrieving, and managing internal Hermes documents (HashiCorp PRDs, RFCs, specs, memos), including relevance search, document metadata, full document content, and related resources.
Click on "Deploy 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., "@Hermes MCP Serversearch for recent PRDs about authentication"
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.
hermes-mcp
An MCP server that turns internal Hermes documents (HashiCorp PRDs, RFCs, specs, memos) into agent tools — relevance search, document metadata, related resources, and full document bodies — plus a companion skill that makes your agent cross-check specs against the code in your editor.
Tools
hermes_search · hermes_get_document · hermes_get_document_content · hermes_get_related_resources · hermes_recently_viewed_docs · hermes_check_auth · hermes_login · hermes_sharepoint_login
Related MCP server: webdocs-mcp
Requirements
Node.js 18+ (developed on 26)
Google Chrome (for the sign-in / browser-content helpers)
An MCP-capable agent (bob, Claude Desktop, VS Code, …)
Quick start
git clone https://github.com/yummydirtx/hermes-mcp.git
cd hermes-mcp
node install.jsThe installer:
runs
npm install,copies the hermes skill into
~/.bob/skills/hermes/,adds a hermes server to
~/.bob/settings/mcp.json(existing servers/secrets are preserved).
Then authenticate and reload your agent (below).
Claude Desktop or VS Code instead of bob? Run
node install.js --claude, or copy a snippet fromexamples/.
Authenticate to Hermes
Hermes sits behind SSO. Capture your session one of two ways:
Automatic (recommended):
npm run attachA normal Chrome opens — sign in. Your session cookie is written to
.hermes-cookieand hot-reloaded by the server. Keep that window open (it's also used for reading document bodies).Manual: in a logged-in Hermes tab, DevTools → Network → click a request → copy the
Cookie:request header into.hermes-cookie:# macOS pbpaste > .hermes-cookie # Windows (PowerShell) Get-Clipboard | Set-Content -NoNewline .hermes-cookie
Verify with the hermes_check_auth tool.
Reading full document bodies
Bodies live in SharePoint. hermes_get_document_content tries, in order (source: "auto"):
Search index — the body Hermes already indexed. No extra permissions. Often enough.
Your browser session (
source: "browser") — reads the file through the Chrome you signed into (npm run attach), over the DevTools protocol. No Microsoft Graph, no admin, no extra scopes — just the access you already have. Keep the document open in that Chrome.Microsoft Graph (
source: "sharepoint", viahermes_sharepoint_login) — needsFiles.Read.All/Sites.Read.All. The built-in client can't obtain these in a locked-down tenant; use a dedicated Azure AD app (below).
Test the browser path directly:
npm run sp-browser "<sharepoint-document-url>"Optional: dedicated Azure AD app (for the Graph path)
Azure Portal → App registrations → New registration → Redirect URI = Public client/native http://localhost → API permissions → Microsoft Graph → Delegated: Files.Read.All, Sites.Read.All, offline_access → Grant admin consent. Then set SP_CLIENT_ID and SP_TENANT_ID in the server env and run hermes_sharepoint_login.
Manual setup (no installer)
Add this to your agent's MCP config, fixing the path (see examples/ for bob / Claude / VS Code variants):
{
"mcpServers": {
"hermes": {
"command": "node",
"args": ["/ABSOLUTE/PATH/TO/hermes-mcp/hermes-mcp.js"],
"env": {
"HERMES_BASE_URL": "https://hermes-sharepoint.hashicorp.services",
"HERMES_COOKIE_FILE": "/ABSOLUTE/PATH/TO/hermes-mcp/.hermes-cookie"
}
}
}
}Then copy skills/hermes/SKILL.md into your agent's skills folder.
Windows notes
Use PowerShell;
node install.jsworks the same.npm run attachlaunches your installed Chrome/Edge. If it isn't found, setHERMES_CHROMEto the browser's.exe.Absolute paths in
argsuse backslashes — the installer writes them correctly; if editing by hand use\\or forward slashes.
Configuration (env)
Var | Default | Purpose |
|
| Hermes host |
|
| Session cookie (hot-reloaded) |
|
| Debug-Chrome port for |
| auto-detect | Path to Chrome/Edge executable |
| – | Dedicated Azure AD app for the Graph path |
|
| Optional pasted Graph token |
Scripts
npm start— run the server (stdio)npm run attach— capture the Hermes session from a real Chromenpm run sp-browser "<url>"— read a document via your browser sessionnode install.js— set up + register with your agent
Security
Never commit .hermes-cookie, .sharepoint-*, or the browser profiles — they hold your live session. .gitignore already excludes them.
Available Tools
8 toolshermes_check_authA
Check whether the Hermes session cookie is valid. Call this if other tools fail with an auth error.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It states the tool checks cookie validity, implying a boolean or success/failure response. While it does not detail the exact output format, the behavior is straightforward and the description is sufficient for a simple check tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description consists of just two sentences, with the key action and usage context front-loaded. Every word is essential, with no redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has zero parameters, no output schema, and a simple purpose, the description is complete. It provides all necessary context for an agent to understand when and why to invoke this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are no parameters, so schema coverage is trivially 100%. The description adds no parameter information, but none is needed as the tool takes no inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the verb 'check' and specifies 'Hermes session cookie validity', clearly indicating what the tool does. It distinguishes itself from sibling tools like hermes_login and hermes_sharepoint_login, which are for obtaining authentication, not checking its validity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to call this tool: 'Call this if other tools fail with an auth error.' This provides clear guidance on the appropriate context, directing agents to use it as a diagnostic step.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hermes_get_documentA
Fetch a Hermes document by its ID (e.g. an objectID from a search result). Returns title, metadata, summary, and source links.
| Name | Required | Description | Default |
|---|---|---|---|
| documentId | Yes | The document objectID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description bears full responsibility. It discloses return fields (title, metadata, summary, source links) but does not specify auth requirements, error behavior, or whether the operation is read-only. Basic behavioral info is provided, but significant gaps remain.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence that efficiently conveys purpose and return. No unnecessary words. It is front-loaded with the action and resource.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one parameter, no output schema), the description is largely complete. It specifies both how to use (by ID) and what is returned. Minor missing details like auth requirements could improve completeness but are not critical.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers the parameter with 100% description. The tool description adds value by explaining that the documentId is typically an objectID from search results, providing context beyond the schema's bare definition.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Fetch', the resource 'Hermes document', and the method 'by its ID'. It provides an example of where the ID comes from (objectID from search), which helps differentiate from sibling tools like hermes_get_document_content that fetch full content.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides context (after search) but does not explicitly state when to use this tool versus alternatives like hermes_get_document_content or hermes_get_related_resources. No when-not-to-use guidance is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hermes_get_document_contentA
Read the FULL text of a Hermes document. By default (source=auto) it tries, in order: the Hermes search index (no SharePoint permissions), then your signed-in browser session over CDP, then a SharePoint/Graph fetch. Provide a documentId (preferred) or a webUrl directly.
| Name | Required | Description | Default |
|---|---|---|---|
| index | No | Which index holds the doc (default: docs). | |
| source | No | auto (default): index → browser → SharePoint. index: only the low-privilege search index. browser: only your signed-in Chrome session (no admin/scopes). sharepoint: force the Graph fetch. | |
| webUrl | No | A SharePoint document URL, if you already have it (used by the browser and SharePoint paths). | |
| maxChars | No | Truncate the returned text to N characters (default 20000). | |
| documentId | No | The document objectID; used for the index lookup and to resolve the SharePoint webUrl. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must disclose all behavioral traits. It explains the automatic fallback sequence, the limitations of the index source (no SharePoint permissions), and the browser source (requires signed-in session). It does not mention potential failures or output format, but the disclosure is thorough for the available information.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences: the first clearly states the purpose, the second covers all key behavioral and parameter guidance. No redundant words, perfectly front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (5 parameters, no output schema), the description is nearly complete. It covers fallback logic, parameter preferences, and default behaviors. Lacking only explicit error handling or return format, which is acceptable without an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds significant value by explaining the interplay between source, documentId, and webUrl, and the truncation behavior with maxChars, surpassing the schema's property descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with 'Read the FULL text of a Hermes document,' a specific verb+resource combination that clearly states the tool's purpose. It distinguishes from siblings by emphasizing the full-text retrieval and multi-source fallback strategy.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use each source mode (index, browser, sharepoint) and advises using documentId as preferred over webUrl. However, it does not explicitly state when not to use this tool or compare it to alternative tools like hermes_get_document.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hermes_loginA
Open a browser sign-in window for Hermes (SSO) and capture the session cookie. By default it WAITS until you finish signing in, then returns success so you can proceed. Call this at the start of a Hermes task if not signed in, or whenever a tool reports an authentication error. (Skips the popup if already signed in.)
| Name | Required | Description | Default |
|---|---|---|---|
| wait | No | Wait until sign-in completes before returning (default: true). | |
| timeoutSeconds | No | Max seconds to wait for sign-in, 30-300 (default: 150). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It discloses waiting behavior by default, popup skipping if already signed in, and session cookie capture. This adds meaningful context beyond the bare schema, though error handling details are omitted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no fluff. The first sentence states core purpose and capture action, the second highlights default behavioral trait, and the third provides usage context. Information is front-loaded and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description notes 'returns success so you can proceed'. It covers parameter usage, behavioral expectations, and use cases. While error handling and return format could be more explicit, the description is sufficiently complete for a login tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds minimal value beyond the schema: it mentions the 'wait' behavior inline but does not elaborate on 'timeoutSeconds'. The schema already documents both parameters adequately.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Open a browser sign-in window for Hermes (SSO) and capture the session cookie', specifying the verb, resource, and action scope. It distinguishes from sibling tools like hermes_check_auth (auth verification) and hermes_sharepoint_login (different SSO).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit guidance is given: 'Call this at the start of a Hermes task if not signed in, or whenever a tool reports an authentication error.' It also mentions automatic skip if already signed in. While it doesn't name alternative tools for checking auth status, the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hermes_recently_viewed_docsA
List the current user's recently viewed Hermes documents.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It only says 'list' with no disclosure of ordering, limits, metadata vs. full content, or authentication requirements. The agent gets minimal behavioral context beyond the name.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence that conveys the verb and resource with no extraneous words. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and no annotations, the description is incomplete. It fails to mention what the returned list contains (IDs, titles, content), any default ordering, or pagination. The agent lacks critical details for using the tool effectively.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are no parameters (100% schema coverage), so the description does not need to add param details. The description adds the core purpose, which is sufficient for this zero-parameter tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (list), the resource (recently viewed Hermes documents), and the scope (current user). It is specific and distinguishes itself from sibling tools like hermes_get_document (single document) and hermes_search (query-based).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for retrieving a list of recently viewed documents but provides no explicit when-to-use, when-not-to-use, or alternative suggestions. With multiple sibling tools, some guidance would be helpful, but the tool's purpose is straightforward.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hermes_searchA
Search Hermes docs or projects by relevance (same engine as the Hermes search bar). Returns ranked results with in-doc snippets and a source link per hit — ideal for grounding an answer with citations.
| Name | Required | Description | Default |
|---|---|---|---|
| index | No | Index to search (default: docs). | |
| limit | No | Max results, 1-50 (default: 10). | |
| query | Yes | The search query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description covers output format (ranked results with snippets and links) but lacks details on auth requirements, rate limits, or other behavioral traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with purpose and engine, no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Adequately describes return values and use case given no output schema, covering all needed context for a simple search tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so description adds minimal extra meaning beyond parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it searches Hermes docs or projects using the same engine as the search bar, distinguishing it from sibling tools like hermes_get_document.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It indicates the tool is ideal for grounding answers with citations, but does not explicitly compare with alternatives or state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
8 tool updates
v1.0.0- First observed
hermes_check_auth - First observed
hermes_get_document - First observed
hermes_get_document_content - First observed
hermes_get_related_resources - First observed
hermes_login - First observed
hermes_recently_viewed_docs - First observed
hermes_search - First observed
hermes_sharepoint_login
TDQS
Scored across 8 tools
Each tool has a clear, distinct purpose: auth checking, document retrieval, full-text content, related resources, login, recently viewed, search, and SharePoint login. No overlapping functionalities.
All tools follow the consistent pattern 'hermes_verb_noun' using snake_case, with descriptive verbs like check, get, login, search, and recently_viewed. No mix of conventions.
8 tools is well-scoped for a document management server, covering authentication, search, retrieval, and related resources without being excessive or insufficient.
The tool surface covers core read operations (search, get, content, related, recent) and auth flows. Missing write operations but likely intentional for a consumption-oriented server.
Maintenance
Related MCP Connectors
Team docs served to AI agents over MCP - search, Markdown reads, version pinning, read audit.
Versioned documentation registry and semantic search for AI tools and coding assistants.
Token-efficient search for coding agents over public and private documentation.
Your team's shipping standards, org map and delivery metrics, inside your coding agent.
Related MCP Servers
- AlicenseAqualityAmaintenanceProvides fast, token-efficient search over coding agent documentation (e.g., Claude Code, Cursor) using local SQLite FTS5 indexing, with tools for searching snippets, reading pages, and grepping markdown.5MIT
- AlicenseNot gradedqualityBmaintenanceCrawl documentation sites, index them with hybrid search, and expose them as MCP tools so LLM agents can search and retrieve current docs.MIT
- AlicenseNot gradedqualityAmaintenanceRoutes coding agents to the most relevant project documentation (decisions, intent, constraints) with provenance and freshness, providing tools for task routing, knowledge search, and document context.28MIT
- AlicenseNot gradedqualityBmaintenanceProvides document search, context retrieval, and indexing tools for AgentOS agents to query pharma documents with grounded citations.MIT