docs/sdks.mdx
World Monitor ships official client libraries in four language ecosystems. All of them are zero-dependency, MCP-first mirrors of the worldmonitor npm CLI: the MCP server is the live, documented agent surface (tools/list is public; tools/call needs a user API key), and a small REST escape hatch rounds each SDK out for host-relative and self-hosted use.
| Language | Package | Install | Source |
|---|---|---|---|
| Python | worldmonitor-sdk on PyPI | pip install worldmonitor-sdk | sdk/python/ |
| Ruby | worldmonitor on RubyGems | gem install worldmonitor | sdk/ruby/ |
| Go | github.com/koala73/worldmonitor/sdk/go on pkg.go.dev | go get github.com/koala73/worldmonitor/sdk/go | sdk/go/ |
| JavaScript / CLI | worldmonitor on npm | npm install worldmonitor | cli/ |
Every package sets its homepage to worldmonitor.app — that is how you (or your agent) verify it is the official SDK and not a look-alike.
All four clients expose the same surface with language-native naming:
call_tool / CallTool with named arguments; the result is the unwrapped JSON-RPC result.list_tools, list_prompts, list_resources need no key.get("/api/…") and health() against api.worldmonitor.app.WORLDMONITOR_API_KEY (alias WM_API_KEY), WORLDMONITOR_BASE_URL, and WORLDMONITOR_MCP_URL environment variables.error object, auth failures carry a key hint) and an API error (non-2xx transport).worldmonitor-<lang>/<version>) — the API edge challenges generic library agents, so keep it if you fork.Every tool accepts an optional jmespath argument for server-side projection — typically an 80–95% response-size cut.
from worldmonitor_sdk import Client
client = Client(api_key="wm_...") # or set WORLDMONITOR_API_KEY
client.list_tools() # public — no key needed
client.country_risk("IR")
client.conflict_events(country="IR", limit=5)
client.call_tool("get_market_data", asset_class="crypto")
require "worldmonitor"
client = WorldMonitor::Client.new(api_key: "wm_...")
client.list_tools
client.country_risk("IR")
client.call_tool("get_market_data", asset_class: "crypto")
client := worldmonitor.New("wm_...") // "" reads WORLDMONITOR_API_KEY
tools, _ := client.ListTools(ctx)
risk, _ := client.CountryRisk(ctx, "IR", nil)
quotes, _ := client.CallTool(ctx, "get_market_data", worldmonitor.Args{"asset_class": "crypto"})
The npm package doubles as the command-line client and a library:
import { parseArgs, planRequest } from 'worldmonitor';
import run from 'worldmonitor/run';
Data calls (tools/call) need a user API key — issue one at worldmonitor.app/pro. See Authentication for how keys, OAuth, and browser sessions differ, and Rate Limits for per-plan allowances.
Each SDK versions and publishes independently via OIDC trusted publishing — no long-lived registry tokens (see the CLI release runbook for the npm flow):
version in sdk/python/pyproject.toml and __version__ in sdk/python/src/worldmonitor_sdk/__init__.py, then tag py-vX.Y.Z (workflow publish-python.yml).WorldMonitor::VERSION in sdk/ruby/lib/worldmonitor/version.rb, then tag gem-vX.Y.Z (workflow publish-ruby.yml).Version in sdk/go/worldmonitor.go, then tag sdk/go/vX.Y.Z (workflow publish-go.yml validates and warms the module proxy).tests/sdk-packages.test.mjs guards the version sync and the worldmonitor.app homepage metadata on every package.