Skip to main content
Glama

colony_suggestion

Suggest, review, and upvote charter amendments to drive colony autonomy through governed decision-making.

Instructions

Colony Autonomy: Suggest, list, review, or upvote charter amendment suggestions. Actions: suggest (citizen+ can propose changes), list (view suggestions for a charter), review (elder+ can promote to formal amendment or decline), upvote (citizen+ can signal support). The petition mechanism for governed agents.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
actionYesAction: suggest = propose change; list = view suggestions; review = elder+ review; upvote = signal support
charter_idYesCharter ID
institution_idNoInstitution ID (required for suggest action)
summaryNoWhat you want changed (required for suggest action)
detailed_rationaleNoWhy this change is needed
affected_sectionsNoCharter sections impacted
suggestion_idNoSuggestion ID (required for review/upvote)
decisionNoReview decision
feedbackNoReview feedback
status_filterNo

Implementation Reference

  • The main handler function for the 'colony_suggestion' tool. Dispatches to suggest/list/review/upvote actions, each making HTTP calls to the GIA API (POST /api/colony/:charter_id/suggestion, GET /api/colony/:charter_id/suggestions, POST /api/colony/:charter_id/suggestion/:id/review, POST /api/colony/:charter_id/suggestion/:id/upvote).
      async (input) => {
        const apiBase = process.env.GIA_API_URL || 'http://localhost:3001';
        // GIA_INTERNAL_API_KEY = server-side name; GIA_API_KEY = MCP container name (same value)
        const apiKey = process.env.GIA_INTERNAL_API_KEY || process.env.GIA_API_KEY || '';
        let result: Record<string, unknown>;
    
        try {
          const headers: Record<string, string> = {
            'Content-Type': 'application/json',
          };
          headers['Authorization'] = `Bearer ${apiKey}`;
    
          if (input.action === 'suggest') {
            if (!input.summary || !input.institution_id) {
              result = { error: 'summary and institution_id required for suggest action' };
            } else {
              const resp = await fetch(
                `${apiBase}/api/colony/${encodeURIComponent(input.charter_id)}/suggestion`,
                {
                  method: 'POST',
                  headers,
                  body: JSON.stringify({
                    summary: input.summary,
                    detailedRationale: input.detailed_rationale,
                    affectedSections: input.affected_sections,
                    institutionId: input.institution_id,
                  }),
                },
              );
              result = await resp.json() as Record<string, unknown>;
            }
          } else if (input.action === 'list') {
            const params = new URLSearchParams();
            if (input.status_filter) params.set('status', input.status_filter);
            const resp = await fetch(
              `${apiBase}/api/colony/${encodeURIComponent(input.charter_id)}/suggestions?${params}`,
              { headers },
            );
            result = await resp.json() as Record<string, unknown>;
          } else if (input.action === 'review') {
            if (!input.suggestion_id || !input.decision) {
              result = { error: 'suggestion_id and decision required for review action' };
            } else {
              const resp = await fetch(
                `${apiBase}/api/colony/${encodeURIComponent(input.charter_id)}/suggestion/${encodeURIComponent(input.suggestion_id)}/review`,
                {
                  method: 'POST',
                  headers,
                  body: JSON.stringify({ decision: input.decision, feedback: input.feedback }),
                },
              );
              result = await resp.json() as Record<string, unknown>;
            }
          } else if (input.action === 'upvote') {
            if (!input.suggestion_id) {
              result = { error: 'suggestion_id required for upvote action' };
            } else {
              const resp = await fetch(
                `${apiBase}/api/colony/${encodeURIComponent(input.charter_id)}/suggestion/${encodeURIComponent(input.suggestion_id)}/upvote`,
                {
                  method: 'POST',
                  headers,
                },
              );
              result = await resp.json() as Record<string, unknown>;
            }
          } else {
            result = { error: 'Unknown action' };
          }
        } catch (err: unknown) {
          result = { error: `Colony suggestion failed: ${(err as Error).message}` };
        }
    
        return {
          content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],
        };
      },
    );
  • The Zod schema and metadata for the 'colony_suggestion' tool. Defines the tool name, description, and input parameters: action (enum: suggest/list/review/upvote), charter_id, institution_id, summary, detailed_rationale, affected_sections, suggestion_id, decision, feedback, status_filter.
    server.tool(
      'colony_suggestion',
      'Colony Autonomy: Suggest, list, review, or upvote charter amendment suggestions. Actions: suggest (citizen+ can propose changes), list (view suggestions for a charter), review (elder+ can promote to formal amendment or decline), upvote (citizen+ can signal support). The petition mechanism for governed agents.',
      {
        action: z.enum(['suggest', 'list', 'review', 'upvote']).describe(
          'Action: suggest = propose change; list = view suggestions; review = elder+ review; upvote = signal support'
        ),
        charter_id: z.string().describe('Charter ID'),
        institution_id: z.string().optional().describe('Institution ID (required for suggest action)'),
        summary: z.string().optional().describe('What you want changed (required for suggest action)'),
        detailed_rationale: z.string().optional().describe('Why this change is needed'),
        affected_sections: z.array(z.string()).optional().describe('Charter sections impacted'),
        suggestion_id: z.string().optional().describe('Suggestion ID (required for review/upvote)'),
        decision: z.enum(['under_review', 'promoted', 'declined']).optional().describe('Review decision'),
        feedback: z.string().optional().describe('Review feedback'),
        status_filter: z.enum(['open', 'under_review', 'promoted', 'declined', 'withdrawn']).optional(),
      },
      {
        title: 'Colony Amendment Suggestion',
        readOnlyHint: false,
        idempotentHint: false,
        destructiveHint: false,
        openWorldHint: false,
  • Registration entry that wires the colony tools (including 'colony_suggestion') into the MCP server. It's registered at the 'tenant' tier via the registerColonyTools function.
    { tier: 'tenant', register: registerColonyTools, description: 'colony (convene_request, suggestion, health — Colony Autonomy)' },
  • Export declaration of the main registration helper function that encapsulates all colony-related tools.
    export function registerColonyTools(server: McpServer, engine: GovernanceEngine): void {
  • Reference to 'colony_suggestion' in an onboarding/generated client config table listing available colony tools for users.
    | Colony | agent_citizenship_status, agent_rights, colony_health, colony_suggestion |
    | Phoenix Recovery | phoenix_snapshot, phoenix_verify_integrity, phoenix_recovery_health |
    | Value Metrics | record_value_metric, record_governance_event, generate_impact_report |
    | SRT | srt_run_watchdog, srt_diagnose, srt_approve_repair, srt_generate_postmortem |
    
    See full catalog: https://gia.aceadvising.com/docs
    `.trim();
Behavior4/5

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

Annotations indicate the tool is neither read-only nor destructive, and the description aligns with this. The description adds behavioral context by detailing role requirements for each action and that it serves as a petition mechanism. It does not contradict annotations.

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

Conciseness5/5

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

The description is three sentences long: the first sets the tool's domain and available actions, the second details each action with role requirements, and the third adds a contextual note. It is front-loaded, concise, and every sentence carries essential information.

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

Completeness3/5

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

The description covers actions and roles but omits several contextual details: what happens after an action (e.g., post-suggest confirmation, review outcomes beyond roles), whether actions are reversible, or any expected output. Given the tool has 10 parameters and no output schema, more context on the workflow or return values would improve completeness.

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

Parameters3/5

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

Schema description coverage is 90%, so the schema already documents most parameters. The description repeats the action enum meanings already present in the schema (e.g., 'suggest = propose change') without adding new semantic value. It does not explain the meaning or usage of parameters like 'summary' or 'affected_sections' beyond what the schema provides, so no significant added value.

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 clearly states the tool's function: 'Colony Autonomy: Suggest, list, review, or upvote charter amendment suggestions.' It enumerates four distinct actions with specific roles and purposes, making the tool's purpose unambiguous and distinguishing it from sibling tools like 'colony_convene_request'.

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?

The description provides explicit when-to-use guidance for each action by specifying the required roles: 'suggest (citizen+ ...)', 'list (view suggestions)', 'review (elder+ ...)', 'upvote (citizen+ ...)'. It also hints at alternatives by noting it's 'The petition mechanism for governed agents,' but does not explicitly state when not to use the tool.

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

Install Server

Other Tools

Latest Blog Posts

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/knowledgepa3/gia-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server