penelope-mcp
OfficialServer Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| NER_DB_CAR | No | Default car name to use when the `car` argument is omitted. If unset, uses LATEST_CAR from config.py. | |
| NER_DB_USER | No | Database user. | readonly |
| NER_DB_SERVER | No | Database server host and port. | server.finishlinebyner.com:59021 |
| PENELOPE_HOST | No | Host address for the hosted mode server. | 0.0.0.0 |
| PENELOPE_PORT | No | Port for the hosted mode server. | 8000 |
| NER_DB_PASSWORD | No | Database password. Defaults to a baked-in read-only password. | |
| PENELOPE_TOKENS | Yes | Comma-separated list of name:token pairs, e.g. "chris:token1,jack:token2". Required for hosted mode. | |
| PENELOPE_EXPORT_DIR | No | Directory to store export files. Defaults to a temp directory. | |
| PENELOPE_EXPORT_TTL | No | Time-to-live in seconds for export files. | 3600 |
| PENELOPE_PUBLIC_URL | No | Public base URL clients use to reach the server. If unset, derived per request from the Host header (usually correct). | |
| PENELOPE_SIGNING_KEY | No | HMAC signing key for export URLs. If unset, a random key is generated per start, invalidating outstanding export links on restart. | |
| PENELOPE_EXPORT_MAX_ROWS | No | Maximum rows allowed in an export; errors rather than truncating. | 5000000 |
| PENELOPE_EXPORT_MAX_BYTES | No | Maximum total bytes for the export directory before sweeping. | 5000000000 |
| PENELOPE_EXPORT_TIMEOUT_MS | No | Timeout for export queries in milliseconds. | 120000 |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| car_infoD | Which car's database these tools read, and its table names. |
| search_topicsA | Find telemetry topics by name. Start here for any data question. Substring match, case-insensitive, order-independent: "volt" finds every topic containing "volt", and "pack temp" finds "BMS/Pack Temp". Each hit reports how many samples exist over the topic's whole lifetime (0 means declared but never logged) and its unit when known. Read three fields before trusting the list:
If more than one hit could plausibly answer the user's question, ask the user to choose rather than picking one yourself. |
| browse_topicsA | List the immediate children of a topic namespace, like Use this to explore, and Call with no Once you reach a specific topic, confirm it with |
| describe_topicA | Profile one topic: sample count, time span, array arity, value range. Use this to confirm a topic is the right one -- and to learn whether its
|
| list_runsA | List recent logging sessions (runs), newest first. A run is one recording session. Use |
| describe_tableC | Columns, types, and nullability for one table in |
| export_seriesA | Export one or more topics to a file and return a link plus a profile. Use this for anything you plan to plot or analyze in code. It returns
no rows: read the returned URL (or path) from your code execution
environment, e.g. Give a time range either as With a
|
| export_queryA | Run arbitrary read-only SQL straight to a file; return a link, not rows. The export escape hatch, for shapes Runs in a READ ONLY transaction. Prefer |
| get_seriesA | Downsampled time series returned INLINE: avg, min, max, count per bucket. Capped at 1000 rows and charged to your context. Use it when you need to
read the numbers to answer a question. For plotting or any bulk
analysis, use
Report the topic name you passed in your answer to the user. |
| run_queryA | Run arbitrary read-only SQL and return rows INLINE, capped at 1000. The escape hatch for questions the other tools do not cover. Runs in a
Postgres READ ONLY transaction with a 30 s statement timeout.
TimescaleDB functions like If you are collecting data to plot, use Name any topic you filtered on in your answer to the user. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 10 tools
Each tool targets a distinct operation: search, browse, and describe cover topic discovery at different levels; run_query/export_query and get_series/export_series are clearly separated by inline-vs-file delivery. The descriptions explicitly reinforce these boundaries, so an agent should rarely confuse one tool for another.
Nine of ten tools follow a consistent verb_noun pattern like export_query, browse_topics, describe_topic, and list_runs. The noun-only 'car_info' is a minor outlier, preventing a perfect score, but the overall convention is predictable.
Ten tools is well-scoped for a telemetry exploration server: discovery, profiling, inline querying, bulk export, and schema/run metadata each have a dedicated tool. There are no redundant or filler tools.
The surface covers the full read-only workflow: find topics, confirm them, query small results inline, export bulk data, and resolve runs or table schemas. The arbitrary read-only SQL escape hatches cover any remaining analytical shapes, leaving no dead ends.