Skip to main content
Glama
dalboki

sonsuchup-mcp

by dalboki

create_case

Create a new mystery case with required name and optional details such as occurrence time, location, and summary. Returns a unique case ID.

Instructions

새 사건을 생성합니다. name은 필수, 나머지는 선택. 생성된 사건의 id(UUID)를 반환합니다.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
nameYes사건명
occurrenceNo발생 시각, datetime-local 형식 (예: "2026-04-20T14:30")
occurrenceErrorNo발생 시각 오차(분)
reportTimeNo신고/인지 시각
locationNo발생 장소
summaryNo사건 요약

Implementation Reference

  • The handler function for create_case. Creates a new CaseData object with provided inputs (defaulting missing optional fields), calls saveCase to persist it, and returns the new case's ID and URL.
      handler: async (input: {
        name: string;
        occurrence?: string;
        occurrenceError?: number;
        reportTime?: string;
        location?: string;
        summary?: string;
      }) => {
        const newCase: CaseData = {
          caseInfo: {
            name: input.name,
            occurrence: input.occurrence ?? '',
            occurrenceError: input.occurrenceError ?? 0,
            reportTime: input.reportTime ?? '',
            location: input.location ?? '',
            summary: input.summary ?? '',
          },
          timelineSettings: { mode: 'auto', manualStart: '', manualEnd: '' },
          people: [],
          edges: [],
          customEvents: [],
          records: [],
        };
        const id = await saveCase(newCase);
        return { id, url: caseUrl(id) };
      },
    },
  • The input schema for create_case using Zod validation. name is required (min length 1); occurrence, occurrenceError, reportTime, location, summary are optional.
    inputSchema: z.object({
      name: z.string().min(1).describe('사건명'),
      occurrence: z
        .string()
        .optional()
        .describe('발생 시각, datetime-local 형식 (예: "2026-04-20T14:30")'),
      occurrenceError: z.number().int().min(0).optional().describe('발생 시각 오차(분)'),
      reportTime: z.string().optional().describe('신고/인지 시각'),
      location: z.string().optional().describe('발생 장소'),
      summary: z.string().optional().describe('사건 요약'),
    }),
  • src/tools.ts:95-136 (registration)
    The tool 'create_case' is registered as part of the exported `tools` array (ToolDef[]). The MCP server in src/index.ts imports this array and routes incoming tool calls via CallToolRequestSchema by matching the tool name.
    {
      name: 'create_case',
      description:
        '새 사건을 생성합니다. name은 필수, 나머지는 선택. 생성된 사건의 id(UUID)를 반환합니다.',
      inputSchema: z.object({
        name: z.string().min(1).describe('사건명'),
        occurrence: z
          .string()
          .optional()
          .describe('발생 시각, datetime-local 형식 (예: "2026-04-20T14:30")'),
        occurrenceError: z.number().int().min(0).optional().describe('발생 시각 오차(분)'),
        reportTime: z.string().optional().describe('신고/인지 시각'),
        location: z.string().optional().describe('발생 장소'),
        summary: z.string().optional().describe('사건 요약'),
      }),
      handler: async (input: {
        name: string;
        occurrence?: string;
        occurrenceError?: number;
        reportTime?: string;
        location?: string;
        summary?: string;
      }) => {
        const newCase: CaseData = {
          caseInfo: {
            name: input.name,
            occurrence: input.occurrence ?? '',
            occurrenceError: input.occurrenceError ?? 0,
            reportTime: input.reportTime ?? '',
            location: input.location ?? '',
            summary: input.summary ?? '',
          },
          timelineSettings: { mode: 'auto', manualStart: '', manualEnd: '' },
          people: [],
          edges: [],
          customEvents: [],
          records: [],
        };
        const id = await saveCase(newCase);
        return { id, url: caseUrl(id) };
      },
    },
  • Helper function saveCase that calls the Supabase RPC 'mcp_save_case' to persist a case. Used by the create_case handler to save the newly created case.
    async function saveCase(caseObj: CaseData): Promise<string> {
      return await callRpc<string>('mcp_save_case', { p_case: caseObj });
    }
  • Helper function to build the case URL from its ID, used by create_case to return the URL of the newly created case.
    const caseUrl = (id: string) => `${WEB_URL}/cases/${id}`;
    const listUrl = () => `${WEB_URL}/cases`;
Behavior3/5

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

Discloses basic behavior: creates a case and returns UUID. No annotations provided, so no contradiction. Lacks detail on side effects, idempotency, or authorization.

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?

Two concise sentences, front-loaded with action, no unnecessary words.

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

Completeness4/5

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

Given 6 parameters, no output schema, and full schema descriptions, the description is fairly complete. Could mention duplicate name handling or error behavior.

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

Parameters4/5

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

Schema coverage is 100%, baseline 3. Description adds meaning by specifying return value and reinforcing optionality of non-name fields.

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?

Description clearly states 'Creates a new case' with required vs optional fields and return value. Distinguishes from sibling tools like update_case_info and list_cases.

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

Usage Guidelines3/5

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

Implied usage: use when creating a new case. No explicit guidance on when not to use or alternatives; e.g., for updates use update_case_info.

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/dalboki/sonsuchup-mcp'

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