Jarvis MCP Server
Sends weather anomaly alerts to a Telegram chat via the Telegram Bot API.
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., "@Jarvis MCP ServerWhat's the current time in Tokyo?"
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.
jarvis-mcp-server
Standalone MCP server(s) for Jarvis. It currently hosts a time server (in the
time_server/ package) that reports the current local time for a city, and is
structured to grow more tool domains over time — each added as its own package
alongside time_server/.
Unlike a stdio MCP server (which a client launches as a subprocess), it runs as an independent network process over Streamable HTTP, so it has its own lifecycle and can be reached by the MCP Inspector, a CLI client, or a Cloud Run deployment.
Tools
Tool | Args | Returns |
|
| Current local time + timezone for the city |
|
| Aggregated weather digest for a city (JSON) |
|
| Compact per-day weather report (JSON) — input to the anomaly pipeline |
|
| Deterministic anomaly report (JSON) |
|
| Sends a Telegram alert if anomalies exist; with |
|
| Start collecting weather for a city; returns the tracked-city list |
|
| Stop collecting a city (its history is kept); returns the tracked-city list |
| — | The cities currently being collected |
|
| The input unchanged (connectivity smoke-test) |
get_current_time is a two-hop pipeline: Open-Meteo geocoding (city → lat/lon)
→ TimeAPI.io (lat/lon → local time). Both APIs are free and need no key. If the
network is unavailable it falls back to the system UTC clock, so a call never
hard-fails.
Tokyo weather digest (a scheduled agent)
The weather_digest/ package runs a continuous agent: while
the server is up, a background thread collects the current weather once an hour
for every tracked city (Open-Meteo, with a mock fallback when offline) and
stores each reading in SQLite (weather_measurements table). The scheduler
starts with the server (via the ASGI lifespan) and stops cleanly on shutdown — it
runs independently of any tool call.
Tracked cities are managed at runtime. Tokyo is tracked by default; add_city
/ remove_city / list_cities change the set live (no restart). add_city does
one immediate collection so a new city has data right away; remove_city only
stops future collection — the city's stored history is preserved (re-adding
resumes with it intact). The set is persisted in a tracked_cities table, so it
survives restarts.
get_weather_digest(period, city) aggregates the stored readings over a window
(city defaults to Tokyo):
{
"city": "Tokyo", "period": "24h", "sample_count": 36,
"average_temperature": 19.0, "min_temperature": 12.7, "max_temperature": 24.1,
"most_common_condition": "overcast", "rainfall_occurrences": 7,
"temperature_trend": "rising",
"window_start": "...", "window_end": "..."
}On a fresh/empty database the store auto-seeds 7 days of realistic hourly mock readings (multiple conditions, rainfall, diurnal temperature swing), so a digest is demoable immediately — before the hourly scheduler has collected anything live.
Env var | Default | Purpose |
|
| SQLite file location |
|
| Default city (always tracked + seeded); add more via |
|
| Seconds between collections (lower for demos) |
Cloud Run note: with
--min-instances 0the service scales to zero when idle, so the hourly collection only runs while an instance is alive. The seed data keeps the digest meaningful regardless; set--min-instances 1for uninterrupted hourly collection.
Weather-anomaly pipeline (three chained tools)
A realistic workflow built from three tools the LLM chains automatically:
get_weather_readings → detect_weather_anomalies → send_telegram_alert"Analyze Tokyo weather for the last week. If unusual weather conditions are detected, send a Telegram alert."
get_weather_readings(city, period)reads the stored measurements and rolls them up server-side into a compact per-day report (mean/min/max temperature and rainy fraction per UTC day). The raw rows never leave the server, so the data the model relays to the next tool stays tiny.periodis capped at 7 days.detect_weather_anomalies(weather_report)applies deterministic rules to that report and lists any anomalies. It accepts only aget_weather_readingsreport — a raw-readings array, a missing marker, too many day-buckets, or an oversized payload are rejected in code (not just by the prompt), so a large array can never be relayed in. Rules (thresholds overridable viaANOMALY_*env vars):Anomaly
Trigger
Default
rapid_temperature_rise/_dropmax/min day-over-day mean Δ
±6 °C
high_temperature_variabilitywindow max − min
18 °C
high_rainfall_frequencymean daily rainy fraction
40 %
unusually_drymean daily rainy fraction (≥ 3 days)
5 %
prolonged_bad_weatherconsecutive mostly-rainy days
3 days
warming_trend/cooling_trendfirst-half vs second-half mean Δ
±4 °C
send_telegram_alert(anomaly_report, notify_when_clear=false)sends a Telegram message only if anomalies were found (otherwise it skips). Passnotify_when_clear=trueto also send a reassuring "all clear" message when no anomalies were detected — handy for a scheduled all-is-well check-in. If Telegram is not configured it reports that without failing. Uses the Telegram Bot API over stdliburllib(no new dependency); the bot token is never logged or returned.
Env var | Default | Purpose |
| (unset) | Bot token from @BotFather. Unset → sends are skipped with |
| (unset) | Chat/channel id to deliver alerts to. |
| (rule defaults) | Override any threshold above, e.g. |
To get a TELEGRAM_CHAT_ID: message your bot, then open
https://api.telegram.org/bot<token>/getUpdates and read result[].message.chat.id.
Related MCP server: Utility MCP Server
Run locally
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
python -m time_server.server # serves http://0.0.0.0:8080/mcpConfiguration (env vars)
Var | Default | Purpose |
|
| Bind address |
|
| Bind port (Cloud Run injects this) |
|
|
|
| (unset) | If set, every request (except |
|
| Server log verbosity |
Security
Auth: set
MCP_API_KEY; clients must send it as theX-API-Keyheader. Comparison is constant-time and the key is never logged. Leaving it unset logs a loud warning and runs the server open — fine for local Inspector testing, never for a public deployment.Health:
GET /healthzis unauthenticated (for Cloud Run / curl probes).
Test with the MCP Inspector
In a second terminal (server still running):
npx @modelcontextprotocol/inspectorIn the Inspector UI:
Transport Type:
Streamable HTTPURL:
http://localhost:8080/mcpConnect → open the Tools tab → run
get_current_timewithcity = London.
Automated checks
python tests/smoke_http.py # end-to-end over Streamable HTTP (server must be up)
pytest -q # offline unit tests (no network, no server)Deployment
See DEPLOY.md for the Cloud Run build/deploy commands, secret setup, and how scaling / cold starts work.
Roadmap
Standalone Streamable HTTP server + tools (
get_current_time,get_weather_digest)Scheduled weather-digest agent (hourly collection → SQLite → aggregation)
Runtime-managed multi-city collection (
add_city/remove_city/list_cities)Weather-anomaly pipeline (
get_weather_readings→detect_weather_anomalies→send_telegram_alert)Local test via MCP Inspector
JarvisCLI client wired (auth-aware, degrades cleanly when down/unauthorized)
API-key auth middleware (pure-ASGI, constant-time,
/healthzexempt)Dockerfile (slim, non-root, port 8080)
Cloud Run deploy guide
This server cannot be installed
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- 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/AlexanderBuiko/jarvis-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server