fieldcure-mcp-essentials
OfficialFieldCure MCP Essentials
Install once, get the basics. A Model Context Protocol (MCP) server that provides 20 essential tools — HTTP requests, web search & fetch, URL file downloads, Wolfram|Alpha computational knowledge, shell commands, JavaScript execution, file I/O, environment info, and persistent memory — for any MCP client. Category search (news, images, scholar, patents) and runtime engine switching (get/set) are always available; capabilities are guarded at invocation time against the active engine. Built with C# and the official MCP C# SDK.
Features
20 essential tools — HTTP, web search & fetch, URL file downloads, runtime search-engine switching (get/set), Wolfram|Alpha, shell, JavaScript sandbox, environment info, file read/write/search, persistent memory + category search (news, images, scholar, patents)
Zero configuration — no API keys needed for default Bing search; optional API keys unlock Serper, Tavily, SerpApi (+ category search tools), and Wolfram|Alpha
Document parsing —
web_fetchandread_fileextract text from PDF, DOCX, HWPX, PPTX, XLSX into Markdown. PDF text extraction is text-layer only; scanned PDFs without a text layer yield empty text. For OCR-backed indexing usefieldcure-mcp-rag.Sandboxed JavaScript — Jint engine with strict limits (timeout, statement count, recursion depth)
SSRF protection — HTTP requests, web fetch, and file downloads block private IP ranges and loopback addresses
Cross-client — works with Claude Desktop, VS Code, AssistStudio, and any MCP-compatible client
Stdio transport — standard MCP subprocess model via JSON-RPC over stdin/stdout
Installation
dotnet tool install -g FieldCure.Mcp.EssentialsAfter installation, the fieldcure-mcp-essentials command is available globally.
From source
git clone https://github.com/fieldcure/fieldcure-mcp-essentials.git
cd fieldcure-mcp-essentials
dotnet buildRequirements
.NET 8.0 Runtime or later
Tools
Tool | Description | Destructive |
| Full HTTP client (GET/POST/PUT/DELETE/PATCH/HEAD) with custom headers and body | — |
| Search the web and return snippets (title, URL, description) | — |
| Fetch a URL and extract content as Markdown — HTML pages and documents (PDF, DOCX, HWPX, PPTX, XLSX) | — |
| Download URL content to disk with a configurable download directory, 100 MB limit, and atomic save | Yes |
| Execute shell commands with working directory, environment variables, shell selection, and output truncation flags | Yes |
| Sandboxed JavaScript execution (Jint) for math, data processing, JSON, regex | — |
| Wolfram|Alpha Full Results API — symbolic math, plots, unit conversions, constants; MathML passes through for native rendering | — |
| System info — local time, timezone, OS, hostname, username, .NET version | — |
| Read files — text with offset/limit, documents (PDF, DOCX, HWPX, PPTX, XLSX) parsed to Markdown | — |
| Write or append text to files with auto directory creation | Yes |
| Search files by glob pattern and content (grep-like) | — |
| Store a key-value memory (persisted in SQLite) | — |
| Delete memories by key or keyword search | Yes |
| Search and list stored memories with FTS5 and pagination | — |
Category Search (SerpApi / Serper / Tavily)
Always registered. Each tool runtime-guards on the active engine's capabilities and returns a descriptive error pointing at set_search_engine when the current engine does not support the category.
Tool | Description | SerpApi | Serper | Tavily |
| Search recent news articles via Google News | Yes | Yes | Yes |
| Search images with size/type filtering | Yes | Yes | — |
| Search academic papers with citation counts | Yes | Yes | — |
| Search patent documents with inventor/assignee filtering | Yes | Yes | — |
Runtime engine switching
Tool | Description |
| Switch the active engine ( |
| Return the currently active engine and its category capabilities. Read-only; use this to reflect live engine state in host UIs or to check category support before calling a category search tool. |
web_search vs web_fetch vs download_file vs http_request
|
|
|
| |
Purpose | API calls, raw HTTP | Web search | Read web pages | Save original files |
Response | Raw (JSON, HTML, etc.) |
| Markdown (body only) | JSON metadata with saved path |
Conversion | None | None | SmartReader HTML → Markdown | None |
Length limit |
|
|
| 100 MB |
Document Parsing
web_fetch and read_file can parse binary documents into Markdown:
Format | Extension | Detection |
| Content-Type / URL extension (text layer only; no OCR) | |
Word |
| Content-Type / URL extension |
Hangul (HWPX) |
| URL extension (no standard Content-Type) |
PowerPoint |
| Content-Type / URL extension |
Excel |
| Content-Type / URL extension |
Output includes headings, tables, math expressions ([math: LaTeX]), and slide/page separators.
File Downloads
download_file saves the original bytes from an HTTP(S) URL. If save_path is omitted, the tool infers a filename from Content-Disposition, the URL path, or a generated fallback name. Relative save_path values resolve under the configured download_directory; absolute paths are used as-is except for protected system directories.
The default download directory is ~/Downloads/mcp and is created automatically on first use. Downloads are written to a temporary file in the destination directory and then committed with an atomic move/replace, so failed or cancelled downloads do not leave a partial final file.
{
"url": "https://example.com/report.pdf"
}{
"url": "https://example.com/report.pdf",
"save_path": "reports/report.pdf",
"overwrite": false
}Web Search
Default engine is Bing (free, no API key needed). For more reliable results, use an API-based engine:
Engine | Free Tier | Category Search | API Key |
Bing (default) | Unlimited (scraping) | — | Not needed |
Serper | 2,500 one-time | news, images, scholar, patents | |
SerpApi | 100/month | news, images, scholar, patents | |
Tavily | 1,000/month | news |
# Use Serper
fieldcure-mcp-essentials --search-engine serper --search-api-key YOUR_KEY
# Use Tavily
fieldcure-mcp-essentials --search-engine tavily --search-api-key YOUR_KEY
# Or via environment variables
ESSENTIALS_SEARCH_ENGINE=serper ESSENTIALS_SEARCH_API_KEY=xxx fieldcure-mcp-essentialsEnvironment Variable Auto-Detection
When --search-engine is omitted, the server scans environment variables and automatically selects the best available engine:
Engine | Environment Variable |
Serper |
|
SerpApi |
|
Tavily |
|
Detection priority: Serper → SerpApi → Tavily → Bing/DuckDuckGo fallback.
API Key Security
Engine | Auth Method | Key Exposure |
Serper | HTTP header ( | Not in URL |
Tavily | Authorization header ( | Not in URL |
SerpApi | URL query parameter ( | Visible in server logs |
Region
Use the region parameter for localized results:
// Korean results
{ "query": "서울 맛집", "region": "ko-kr" }
// US English results
{ "query": "best restaurants NYC", "region": "en-us" }
// Global (default)
{ "query": "Python tutorial" }Without --search-engine, a fallback engine (Bing → DuckDuckGo) auto-switches on CAPTCHA. Free engines rely on scraping and may be intermittent — an API-based engine is strongly recommended for any non-trivial use.
Explicit paid engine without a key — MCP Elicitation
When --search-engine serper|tavily|serpapi is selected explicitly but no API key is configured (CLI arg, ESSENTIALS_SEARCH_API_KEY, or engine-specific env var), the server waits until the first web_search call and then asks the MCP client for the key via MCP Elicitation. If the user declines, a follow-up prompt asks whether to run the search with free Bing/DuckDuckGo instead. Declining both lets the tool soft-fail with a clear message so the LLM can recover.
Clients without Elicitation support (including older CLI hosts) fall back to the free engine immediately, matching the pre-2.1 behaviour. Cached keys live for the process lifetime; the host can re-elicit after an upstream 401/403 if the tool invalidates the cache.
Wolfram|Alpha
wolfram_alpha calls the Full Results API v2 and returns mixed content — plaintext, MathML (passed through verbatim for clients that render MathML natively, e.g. ChatPanel/WebView2), and plot images embedded as ImageContent. The API's reinterpret=true flag is always on so most typo-level failures auto-correct server-side; only real parse failures surface isError: true with assumptions > tips > didyoumeans guidance.
AppID
Set WOLFRAM_APPID to the AppID obtained at developer.wolframalpha.com (select "Full Results API"; free tier: 2,000 calls/month, non-commercial). On MCP clients that support Elicitation the key can also be supplied interactively on first use. A rejected AppID (401/403) triggers a single invalidate-and-retry so a mistyped key can be re-elicited; the existing ApiKeyResolverRegistry re-elicit cap (2 per env-var slot) prevents loops.
⚠️ Use
developer.wolframalpha.com, notdeveloper.wolfram.com— the latter is a separate paid portal and will show "no permission to access any API keys" for free accounts.
The tool is always registered regardless of AppID status; without a key it returns a setup-guidance error so the model can inform the user instead of silently skipping.
Query tips (surfaced in the tool description)
English only, simplified keyword form (
'France population', not'how many people live in France')Exponent notation
6*10^14, never6e14Single-letter variables (
x,y,n)Named physical constants (
'speed of light', not299792458)For equations with units, solve without units first
RECOMMENDED / AVOIDhints steer the model — simple arithmetic torun_javascript, general web queries toweb_search, subjective/news questions away from Wolfram
JavaScript Sandbox
run_javascript uses the Jint engine with strict limits:
Constraint | Value |
Timeout | 5s default, 30s max |
Max statements | 100,000 |
Recursion depth | 64 |
Strict mode | Enforced |
Allowed: Math.*, JSON, Date, RegExp, console.log, string/array methods, parseInt, encodeURIComponent, atob/btoa
Blocked: setTimeout, setInterval, require, import, .NET interop, eval()
Variables can be injected into the script scope for data pipeline use:
1. http_request(url: "https://api.example.com/data") → {"items": [...]}
2. run_javascript(
code: "data.items.filter(x => x.price > 100).map(x => x.name)",
variables: {"data": {"items": [...]}}
)Run Command
run_command defaults to the backward-compatible shell for the host: cmd.exe on Windows and /bin/sh on Unix. Use shell when a command requires specific syntax:
Shell | Notes |
| Default; |
| PowerShell Core; recommended for PowerShell-native commands when installed |
| Windows PowerShell fallback for Windows hosts without |
| Explicit Windows |
| Explicit Bash when available |
| Explicit POSIX shell when available |
Verbose output is capped per stream with max_output_chars (default 100,000). Responses include shell_used, stdout_truncated, and stderr_truncated; truncated streams include an inline marker with the omitted character count.
Memory
Memories are stored in SQLite (%LOCALAPPDATA%/FieldCure/Mcp.Essentials/memory.db) and shared across all MCP clients on the same machine.
# Custom memory path
fieldcure-mcp-essentials --memory-path /path/to/memory.db
# Or via environment variable
ESSENTIALS_MEMORY_PATH=/path/to/memory.db fieldcure-mcp-essentialsConfiguration
Essentials settings
The default settings file is:
Windows:
%LOCALAPPDATA%/FieldCure/Mcp.Essentials/settings.jsonmacOS/Linux: the platform local app-data folder plus
FieldCure/Mcp.Essentials/settings.json
{
"download_directory": "~/Downloads/mcp"
}Download directory precedence is:
CLI:
--download-directory <path>Environment:
ESSENTIALS_DOWNLOAD_DIRECTORYSettings file:
download_directoryDefault:
~/Downloads/mcp
Use --settings-path <path> or ESSENTIALS_SETTINGS_PATH to point at a different settings file.
Claude Desktop
Add to claude_desktop_config.json:
{
"mcpServers": {
"essentials": {
"command": "fieldcure-mcp-essentials"
}
}
}With a search engine:
{
"mcpServers": {
"essentials": {
"command": "fieldcure-mcp-essentials",
"args": ["--search-engine", "serper", "--search-api-key", "YOUR_KEY"]
}
}
}VS Code (Copilot)
Add to .vscode/mcp.json:
{
"servers": {
"essentials": {
"command": "fieldcure-mcp-essentials"
}
}
}From source (without dotnet tool)
{
"mcpServers": {
"essentials": {
"command": "dotnet",
"args": [
"run",
"--project", "C:\\path\\to\\fieldcure-mcp-essentials\\src\\FieldCure.Mcp.Essentials"
]
}
}
}Data Storage
Data | Location |
Memory database |
|
Settings file |
|
Default downloads |
|
Search API keys | Environment variables ( |
Project Structure
src/FieldCure.Mcp.Essentials/
├── Program.cs # MCP server entry point (stdio)
├── Configuration/
│ └── EssentialsSettings.cs # Server settings and download directory resolution
├── Http/
│ └── SsrfGuard.cs # SSRF protection (shared by http_request & web_fetch)
├── Memory/
│ └── MemoryStore.cs # SQLite + FTS5 memory storage
├── Search/
│ ├── ISearchEngine.cs # Search engine interface
│ ├── ICategorySearchEngine.cs # Category search interface (news, images, scholar, patents)
│ ├── SearchResult.cs # Search result record
│ ├── BingSearchEngine.cs # Bing scraping (default)
│ ├── DuckDuckGoSearchEngine.cs # DuckDuckGo lite scraping
│ ├── FallbackSearchEngine.cs # Auto-rotate on CAPTCHA
│ ├── SerperSearchEngine.cs # Serper.dev API (+ category search)
│ ├── TavilySearchEngine.cs # Tavily API (+ news)
│ └── SerpApiSearchEngine.cs # SerpApi API (+ category search)
└── Tools/
├── HttpRequestTool.cs # http_request
├── WebSearchTool.cs # web_search
├── WebFetchTool.cs # web_fetch (SmartReader)
├── DownloadFileTool.cs # download_file
├── CategorySearchTools.cs # search_news / search_images / search_scholar / search_patents
├── RunCommandTool.cs # run_command
├── RunJavaScriptTool.cs # run_javascript (Jint sandbox)
├── WolframAlphaTool.cs # wolfram_alpha (Full Results API, MathML pass-through)
├── GetEnvironmentTool.cs # get_environment
├── ReadFileTool.cs # read_file
├── WriteFileTool.cs # write_file
├── SearchFilesTool.cs # search_files
└── MemoryTools.cs # remember / forget / list_memoriesDevelopment
# Build
dotnet build
# Test
dotnet test
# Pack as dotnet tool
dotnet pack src/FieldCure.Mcp.Essentials -c ReleaseSee Also
Part of the AssistStudio ecosystem.
License
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/fieldcure/fieldcure-mcp-essentials'
If you have feedback or need assistance with the MCP directory API, please join our Discord server