Overview
Index values come from the OECD share price series published on FRED, one monthly series per country, normalised so that the 2015 average equals 100 and not seasonally adjusted. A collector checks FRED every morning, keeps the newest reading as the current value and stores each year's months for history. `value` is that index level and `date` is the first day of the month it describes; `baseline` is always `2015=100`.
Without `year` and `month` you get the newest stored month. With them (paid plans) you get that exact month; `year` must be 2000 or later and not in the future, `month` must be 1 to 12, and sending `month` without `year` is rejected with a 400. A month that the series has not published yet returns a 404 rather than a nearby month.
`previousValue` and `previousDate` are the closest earlier stored month, and `changeDirection` compares the two. The paid `change1m` to `change12m` fields are percent changes against the reading exactly that many months earlier, rounded to four decimals, and are null when that month is missing. `changeYtd` is measured against the previous December, so for a January reading it equals `change1m`. `high12m`, `low12m` and `average12m` cover the twelve months ending at the returned one and need at least two stored readings. `history`, only on paid plans with `history=true`, lists those months oldest first.
Live Test Global Stock Market Skill Skill →
The tool
Once your client is connected to the VerveKit server, this appears in its tool list as GlobalStockMarketSkill. It is read-only and open-world — it fetches and never mutates anything on your side — so most clients call it without asking you to confirm.
{
"name": "GlobalStockMarketSkill",
"arguments": {
"country": "DE"
}
}You do not name the tool yourself; the model picks it. Asking about DE in the terms this skill covers is enough for it to reach for GlobalStockMarketSkill on its own — naming it explicitly also works, and is the way to force the call.
Connecting
One server URL covers every skill in the catalog, including this one. Authorization is OAuth: the client opens a browser once, and there is no key to paste into a config file.
{
"mcpServers": {
"vervekit": {
"url": "https://api.vervekit.com/v1/mcp"
}
}
}https://api.vervekit.com/v1/mcpPer-client setup — Claude, Cursor, VS Code, ChatGPT — is on the MCP setup page.
Arguments
These are the properties on the tool's inputSchema, so a well-behaved client validates them before the call is made. Premium arguments are accepted on every plan but only take effect on plans that include them.
| Argument | Type | Description |
|---|---|---|
countryRequired | string | ISO 2-letter country codeAUATBEBRCACHCLCN+28length 2–2 |
yearOptionalPremium | integer | Year to retrieve data for (2000-present). Requires month parameter. range 2000–2030 |
monthOptionalPremium | integer | Month to retrieve data for (1-12). Required when year is specified. range 1–12 |
historyOptionalPremium | boolean | Include the 12 monthly readings ending at the returned month |
What the model gets back
The result carries a structuredContent object matching the tool's declared outputSchema, so a client reads fields without parsing prose. status is "ok" and error is null on success; a null field means the value was not available for that input, not that the call failed.
{
"status": "ok",
"error": null,
"data": {
"country": "DE",
"countryName": "Germany",
"baseline": "2015=100",
"year": 2026,
"month": 9,
"value": 159.6559,
"date": "2026-09-01",
"previousValue": 163.2341,
"previousDate": "2026-08-01",
"changeDirection": "down",
"change1m": -2.1921,
"change3m": 2.3115,
"change6m": 6.7657,
"change12m": 5.4324,
"changeYtd": 3.4851,
"high12m": 163.2341,
"low12m": 149.5385,
"average12m": 156.1535,
"history": [
{
"date": "2025-10-01",
"value": 154.4256
},
{
"date": "2025-11-01",
"value": 150.3501
},
{
"date": "2025-12-01",
"value": 154.2791
},
{
"date": "2026-01-01",
"value": 159.3243
},
{
"date": "2026-02-01",
"value": 160.134
},
{
"date": "2026-03-01",
"value": 149.5385
},
{
"date": "2026-04-01",
"value": 153.3461
},
{
"date": "2026-05-01",
"value": 156.074
},
{
"date": "2026-06-01",
"value": 156.0489
},
{
"date": "2026-07-01",
"value": 157.4312
},
{
"date": "2026-08-01",
"value": 163.2341
},
{
"date": "2026-09-01",
"value": 159.6559
}
]
}
}
Response fields
Paths are relative to data. Premium fields are absent rather than zeroed on plans that do not include them, so check for presence instead of comparing to 0.
| Field | Type | Example | Description |
|---|---|---|---|
country | string | DE | ISO 2-letter country code for the market |
countryName | string | Germany | Full country name for the stock market |
baseline | string | 2015=100 | Baseline year for index normalization (2015=100) |
year | number | 2026 | Year of the returned data |
month | number | 9 | Month of the returned data (1-12) |
value | number | 159.6559 | Normalized share price index value (2015=100) |
date | string | 2026-09-01 | Date of the data point (YYYY-MM-DD) |
previousValue | number | 163.2341 | Index value of the month before the returned one |
previousDate | string | 2026-08-01 | Date of the previous month's reading (YYYY-MM-DD) |
changeDirection | string | down | Direction of the move from the previous month: up, down or unchanged |
change1mPremium | number | -2.1921 | Percent change from one month earlier |
change3mPremium | number | 2.3115 | Percent change from three months earlier |
change6mPremium | number | 6.7657 | Percent change from six months earlier |
change12mPremium | number | 5.4324 | Percent change from twelve months earlier |
changeYtdPremium | number | 3.4851 | Percent change since the previous December's reading |
high12mPremium | number | 163.2341 | Highest monthly value in the 12 months ending at the returned month |
low12mPremium | number | 149.5385 | Lowest monthly value in the 12 months ending at the returned month |
average12mPremium | number | 156.1535 | Average monthly value over the 12 months ending at the returned month |
historyPremium | array[12] | The 12 monthly readings ending at the returned month, oldest first (when history=true) | |
history.0.datePremium | string | 2025-10-01 | Date of the reading (YYYY-MM-DD) |
history.0.valuePremium | number | 154.4256 | Normalized share price index value (2015=100) |
Failure modes
Errors come back as tool errors carrying a sentence the model can act on, not a bare status code. Error handling covers the full list.
| Status | What it means |
|---|---|
400 / 422 | The arguments did not validate. The message names the offending one. |
401 | The OAuth session is invalid or expired — reconnect the server. |
403 | Blocked by a key restriction or an IP allow-list. Never a bad identity. |
404 | This skill is not part of VerveKit. Check the catalog. |
429 | Out of credits, or a brief rate limit. The message tells them apart. |
A call costs 2 credits each time the tool actually runs; a model that reasons about the tool without calling it costs nothing.
Use cases
- Country Comparison
- Compare stock market performance between countries like Germany vs France over the past decade
- Economic Research
- Analyze global market trends and correlations between national economies
- Investment Analysis
- Evaluate which country markets have outperformed or underperformed relative to 2015 baseline
- Market Dashboards
- Build global market overview dashboards showing performance across regions
Other ways to use Global Stock Market Skill
Set up Global Stock Market Skill on VerveKit, or reach the same source a different way. Your VerveKit account and credits work on all of them — one key, one balance.
Related
More in Finance: