agentic-mcp-server
Click on "Install 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., "@agentic-mcp-server@agentic-mcp-server search for 'onboarding' in the knowledge base"
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.
agentic-mcp-server
A production-grade Model Context Protocol server template in TypeScript, with the agentic-kit built in: one AGENTS.md every AI coding agent reads, skills that encode how to add tools, resources, and prompts, hooks that block destructive commands and force just check to pass before an agent can say "done", and a multi-model (Claude + Codex + Gemini) code-review council in CI.
It ships a small but complete example, a markdown knowledge base, exposed three ways: tools (kb.search, kb.get, kb.add, sys.time), resources (kb://index, kb://doc/{slug} with listing and completion), and prompts (summarise-doc, answer-with-sources). It runs over stdio for local hosts (Claude Code, Claude Desktop, Cursor) and over Streamable HTTP (stateless, bearer-token protected) for shared deployments. Tool handlers are SDK-free definitions; only src/server.ts and the transports touch @modelcontextprotocol/sdk, so upgrading to the v2 SDK line is a two-file change. Tests drive the server in-process through the official client, over real HTTP, and with the MCP Inspector CLI.
60-second quickstart
git clone https://github.com/kalpesh122/agentic-mcp-server my-mcp && cd my-mcp
just setup && just build
just test-inspector # tools/list + a tools/call through the Inspector CLIRegister it in Claude Code (project scope) with the included .mcp.json, or:
claude mcp add --scope project kb -- node dist/index.jsRequirements: Node 24 (.node-version), just. Docker only for the image.
Related MCP server: bare-mcp
Commands
Command | What it does |
| Install dependencies (pnpm 12 via corepack) |
| Run over stdio / Streamable HTTP with watch |
| Vitest (in-process client, HTTP transport, store, env) |
| Build and drive |
| Open the Inspector UI against the built server |
| Biome check / fix |
|
|
| Compile to |
| Quality gate: lint + typecheck + test + build |
| Image and compose (HTTP mode on 3333) |
| Local multi-model code review of your branch |
Capabilities
Tools
Tool | Description | Annotations |
| Full-text search over the knowledge base; nested | read-only, idempotent |
| Full markdown of one document by slug | read-only, idempotent |
| Create a document; refused unless | write, non-destructive |
| Current time, optional IANA zone | read-only |
Resources
URI | Content |
| JSON list of |
| One document as |
Prompts
Prompt | Arguments | Purpose |
|
| Five-bullet summary of one document |
|
| Answer using only the knowledge base, citing slugs |
Register the server
Claude Code (.mcp.json, committed in this repo):
{ "mcpServers": { "kb": { "type": "stdio", "command": "node", "args": ["dist/index.js"] } } }HTTP mode: { "type": "http", "url": "http://localhost:3333/mcp", "headers": { "Authorization": "Bearer ${MCP_AUTH_TOKEN}" } } or
claude mcp add --transport http --scope project kb http://localhost:3333/mcp --header "Authorization: Bearer $MCP_AUTH_TOKEN".
Cursor (.cursor/mcp.json): same mcpServers shape as above.
Claude Desktop (macOS: ~/Library/Application Support/Claude/claude_desktop_config.json): same mcpServers shape; use an absolute path to dist/index.js and fully quit the app after editing.
Configuration
See .env.example. MCP_TRANSPORT (stdio | http), MCP_HTTP_PORT/MCP_HTTP_HOST, MCP_AUTH_TOKEN (required, 16+ chars, in HTTP mode), KB_DIR (markdown directory), MCP_ALLOW_WRITES, LOG_LEVEL. The --transport CLI flag overrides the env.
Folder map
src/index.ts CLI entry (--transport), env, knowledge base, start
src/env.ts src/log.ts zod env · pino to stderr
src/server.ts createServer(deps): registers tools, resources, prompts (only SDK touchpoint besides transports)
src/tools/ types.ts (defineTool, text, failure) + one file per tool + index.ts
src/resources/ kb://index, kb://doc/{slug}
src/prompts/ summarise-doc, answer-with-sources
src/kb/store.ts KnowledgeBase (load, search, get, add)
src/transports/ stdio.ts · http.ts (express: /health, bearer-protected stateless /mcp)
test/ helpers (in-memory client), server.test.ts, http.test.ts
data/*.md knowledge base documents (frontmatter title/tags)
.claude/ .agents/ AGENTS.md the agentic kitHow AI agents work in this repo
AGENTS.md(≤150 lines) is the map: commands, layout, hard rules, definition of done.CLAUDE.mdimports it; Gemini, Copilot, and Cursor point at it.Skills in
.claude/skills/(mirrored in.agents/skills/):add-tool,add-resource,add-prompt, plus the kit'sbrainstorm-spec,tdd,debug,code-review,council-review,verify-before-done,adr,git-hygiene.Hooks in
.claude/settings.json: blockrm -rf, force pushes, reading.env; protect lockfiles; format every edited file with Biome; runjust checkwhen the agent tries to stop and block if it fails.CI:
ci.ymlrunsjust checkand the Inspector smoke, then builds the image;ai-council-review.ymlhas three models review every PR and post one consolidated comment.specs/001-knowledge-base/shows the spec → plan → tasks flow;docs/adr/records why the stack looks like this.
Swap-outs
Domain: replace
src/kb/and the tools insrc/tools/with your own; keepdefineTooland the tests' shape.Auth: replace
bearerAuthinsrc/transports/http.tswith OAuth 2.1 resource-server checks; keep/healthpublic.SDK v2 (
@modelcontextprotocol/server2.x, spec 2026-07-28): change the imports insrc/server.tsandsrc/transports/*; tool definitions do not change.Hosting: the image runs HTTP on 3333 behind any TLS-terminating proxy.
License
MIT © Kalpesh Mali
Available Tools
4 toolskb.addAdd a documentA
Create a new markdown document in the knowledge base. Fails if writes are disabled on this server or the slug already exists. Ask the user before calling this.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Markdown body | |
| slug | Yes | kebab-case identifier, e.g. "release-checklist" | |
| tags | No | ||
| title | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the write nature (matching readOnlyHint=false) and adds specific failure modes, going beyond the annotations to explain behavior.
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 concise, using two sentences that cover purpose and key constraints without unnecessary details.
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?
For a simple create operation, the description covers necessary context: what it does, when it fails, and the need for user confirmation. No output schema is required for 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?
Schema covers 'body' and 'slug' descriptions, but 'title' and 'tags' lack descriptions. The description text adds no parameter-specific information, so it does not compensate for the missing schema coverage.
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 ('Create a new markdown document') and the resource ('knowledge base'), distinguishing it from sibling tools like kb.search and kb.get.
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?
Explicitly states failure conditions (writes disabled, slug already exists) and instructs the user to ask before calling, providing clear guidance on when to use the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kb.getRead a documentARead-onlyIdempotent
Return the full markdown body of one knowledge-base document by slug (as returned by kb.search).
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Document slug, e.g. "getting-started" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint and idempotentHint as true, covering side-effect safety. The description adds the return format ('full markdown body') and that it returns a single document, but these are minor additions beyond the annotations.
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, focused sentence with no superfluous words. It is well-structured, front-loading the core action and then the parameter detail, making it easy to parse quickly.
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?
For a simple read-only tool with one parameter and no output schema, the description provides all necessary context: what it returns (full markdown body), how to identify the document (by slug), and where the slug comes from (kb.search). No critical information is missing.
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 provides a clear description for the slug parameter (including an example). The tool description reinforces this and adds the important context that the slug comes from kb.search, which helps the agent understand how to populate the parameter correctly.
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 tool's action ('Return'), the resource ('knowledge-base document'), and the means ('by slug'). It also references kb.search for obtaining the slug, making the purpose unambiguous and distinct from the sibling tools.
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 implicitly guides usage by stating the slug is 'as returned by kb.search', which tells the agent to use kb.search first. However, it does not explicitly contrast with kb.add or state when not to use this tool, so it falls short of fully explicit guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kb.searchSearch the knowledge baseARead-onlyIdempotent
Full-text search over the markdown knowledge base. Returns the best-matching documents with a slug (use it with kb.get), title, score and a short snippet. Use this first when you need information you do not already have.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of hits | |
| query | Yes | Search terms; matches title, tags and body | |
| filter | No | Optional filters |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the description does not need to repeat those. It adds no extra behavioral details beyond what the annotations provide, but it also does not contradict them.
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 compact and well-structured: one sentence states the core purpose and another covers the output and usage workflow. No unnecessary words or redundant details are present.
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?
Since there is no output schema, the description usefully specifies the return fields: slug, title, score, and snippet. It also explains the relationship with kb.get. It does not mention error cases or empty results, but for a search tool this is reasonably complete.
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 all parameters with descriptions: query, limit, and filter with nested tag and sort. The tool description adds no additional parameter-level detail beyond the schema, so it remains at the baseline for full schema coverage.
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 specific verb 'search' and clearly identifies the resource as the markdown knowledge base. It states the tool returns best-matching documents, and the phrase 'Use this first when you need information you do not already have' clearly differentiates it from other retrieval tools like kb.get.
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 says to use this tool first when needing information, and it mentions using the returned slug with kb.get, which provides workflow context. It does not explicitly enumerate when not to use it or compare with kb.add or sys.time, but the guidance is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sys.timeCurrent timeARead-only
Return the current date and time in ISO 8601, optionally for an IANA time zone.
| Name | Required | Description | Default |
|---|---|---|---|
| timeZone | No | IANA zone such as "Asia/Kolkata"; defaults to UTC |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the output format (ISO 8601) and the optional timezone behavior, which goes beyond the readOnlyHint annotation. While the read-only nature is already declared, the description adds useful behavioral details about the response, such as format and timezone handling.
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 conveys all essential information without unnecessary wording. It is well-structured and directly states the tool's purpose and optional parameter.
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?
For a simple tool that returns the current time, the description, combined with the schema, covers all necessary context: what the tool does, the output format, and the parameter's meaning and default. No additional information is needed for a user to invoke it correctly.
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 already provides a clear description for the timeZone parameter, including an example and default behavior. The tool description adds no new information about the parameter beyond what is already in the schema, so it does not enhance the parameter semantics beyond the baseline.
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 tool's function: returning the current date and time in ISO 8601 format, with an optional timezone parameter. It is specific about the resource (current time) and the action (return), leaving no ambiguity about what the tool does.
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 implicitly distinguishes this tool from the sibling knowledge-base tools (kb.search, kb.get, kb.add) by focusing on time retrieval. However, it does not explicitly state when to prefer this over alternatives, though the distinct purpose makes the use case obvious. A minor lack of explicit guidance prevents a perfect score.
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. Dates show when Glama detected each change.
4 tool updates
v0.1.0- First observed
kb.add - First observed
kb.get - First observed
kb.search - First observed
sys.time
TDQS
Each tool targets a distinct operation: search returns matches, get retrieves a full document by slug, add creates a new document, and sys.time provides system time. There is no overlap in purpose or return type.
The knowledge base tools follow a consistent kb.<verb> pattern (search, get, add), and the system tool uses sys.time. Prefix-based namespaces make the convention predictable and easy to reason about.
Four tools is a compact but reasonable set for a focused knowledge base server with a system utility. It is not overly thin, though a couple more operations could strengthen the scope.
The surface covers search, retrieval, and creation of knowledge base documents, but lacks update, delete, and list-all operations. This leaves notable CRUD gaps that agents cannot work around directly.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
A Model Context Protocol server for Wix AI tools
Model Context Protocol server for the Apideck Unified API. Connect any MCP-compatible agent framework to 100+ accounting systems, HRIS platforms, file storage providers, and more through one integration. More information https://www.apideck.com/mcp-server
Remote MCP server exposing SMI Aware tools, resources, and skills over Streamable HTTP.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceModel Context Protocol server that standardizes tool discovery, execution, and context management for AI applications.MIT
- AlicenseNot gradedqualityDmaintenanceA minimal, general-purpose implementation of the Model Context Protocol (MCP) for Node.js and Bare runtime, enabling creation of AI-interactive servers with tools, resources, and multiple transport options.112MIT
- FlicenseNot gradedqualityBmaintenanceModel Context Protocol server for MCPGRAM that enables MCP clients to interact with connectors like GitHub, Slack, and Notion through stdio or Streamable HTTP transports.-
- FlicenseNot gradedqualityAmaintenanceA minimal Model Context Protocol server exposing arithmetic, time, and note-taking tools over streamable HTTP, with in-memory state and Docker support.-
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/kalpesh122/agentic-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server