Skip to main content
Glama
roman-zaglauer

OctoBot MCP Server

update_profile

Update an existing trading profile's metadata (risk, complexity, or other fields) by supplying its profile ID and a patch object. Avoid renaming the active profile; numeric values are required for risk and complexity.

Instructions

Update an existing profile's metadata (never the active/selected profile's name).

Maps to POST /profiles_management/update with JSON body {"id": profile_id, **patch} (confirmed against source models/profiles.py::update_profile(), which reads exactly this shape).

Spec corrections, both verified against source and reproduced live:

  • patch["risk"]/patch["complexity"] must be an int (or int-parseable string) matching OctoBot's enum ordinals -- not the display strings list_profiles returns ("Low", "Difficult", ...). Source (octobot_commons.enums): ProfileRisk is LOW=1, MODERATE=2, HIGH=3; ProfileComplexity is EASY=1, MEDIUM=2, DIFFICULT=3. Sending a display string (confirmed live) raises an uncaught ValueError inside OctoBot, surfaced by this tool as a ProfileUpdateRejectedError wrapping "invalid literal for int() with base 10: 'Moderate'", HTTP 500 -- not the clean UPDATE_REJECTED 400 path.

  • patch["config"] is accepted by this tool's input schema for forward-compatibility with the documented spec shape, but is currently silently ignored by OctoBot's deployed route: the controller only ever calls models.update_profile(id, data) -- never passing the third json_profile_content parameter that is the only thing update_profile() actually assigns to profile.config. There is no way for this tool to make config take effect against the current OctoBot version.

  • Renaming the currently-selected profile is rejected by OctoBot itself ("Can't rename the active profile", confirmed live), surfaced here as ProfileUpdateRejectedError with that exact message.

Output: {"profile_id": str, "updated_fields": object} (updated_fields echoes the patch this tool sent -- OctoBot's own success response is the same data echoed back, so there is nothing more to report).

Not confirm-gated (ADR-0003): does not destroy anything or touch credentials/live trading.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
patchYes
profile_idYes

Schema Changelog

Changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. First observedv0.1.0

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and delivers thoroughly: it discloses the exact endpoint/body mapping, the enum-ordinal encoding trap for risk/complexity with the resulting ValueError/HTTP 500, the silently-ignored config parameter, the active-profile rename rejection with its exact error message, the output shape, and a side-effect disclaimer (not confirm-gated, does not destroy anything, no credentials/live trading).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but front-loaded with a one-sentence purpose and densely organized with bold spec-correction bullets and a separate output section; nearly every sentence earns its place given the tool's traps. Minor verbosity in the live-reproduction narrative (exact error string, source path references) prevents a perfect score.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema and no annotations, so the description must cover return values and side effects — it does, including the exact output contract and the two failure modes with their surfaced error type. For a tool with hidden traps (enum encoding, ignored config, active-profile restriction), an agent has everything needed to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the schema only types patch as a generic object with additionalProperties true. The description compensates by naming the meaningful patch keys (risk, complexity, config), specifying the required int/enum-ordinal encoding for risk and complexity, mapping profile_id to the body's id field, and noting that updated_fields echoes the sent patch.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: "Update an existing profile's metadata" and immediately adds a scope constraint ("never the active/selected profile's name"). This boundary condition, reinforced later by the active-profile rename rejection, makes the tool easy to distinguish from sibling create_profile, delete_profile, and select_profile without ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides a clear when-not in the first sentence (never rename the active/selected profile) and explicitly warns that patch['config'] silently has no effect against the current OctoBot version, so an agent knows not to attempt it. However, it never names sibling alternatives or states conditions for choosing this tool over them, so it stops short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.