agentleFS
rfdiosuaorfdiosuao/AgentSkill/atypica-research/SKILL.md

atypica-research

Skill15 starsChanged 4 months agoMITView on GitHub

Access atypica.ai's AI-powered business research capabilities through MCP protocol. Use when users need to conduct consumer research, market analysis, product testing, or generate insights about business questions. Supports creating research sessions, sending messages with AI execution, handling user interactions (question prompts and plan confirmations), retrieving conversation history, checking research status, accessing generated reports/podcasts, and searching AI personas for interviews.

  • Sends data out

The file

We split this skill into the rules it gives an agent

11 rules. About 0 are common, 3 are distinctive, and 8 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈3

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 8

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    If tools starting with atypica_ are already available, the MCP server is configured.

    line 16
  2. Distinctive:

    When you don't have an MCP client, curl + jq is the most flexible combination.

    line 40
  3. Very specific:

    Use jq '.result.structuredContent' to extract the structured response

    line 76
  4. Very specific:

    Use jq '.result.content[0].text' to get the human-readable summary

    line 77
  5. Very specific:

    Use tail parameter in get_messages (3-5 parts) instead of fetching everything

    line 79
  6. Distinctive:

    Before plan confirmation: every 30 seconds

    line 178
  7. Distinctive:

    After plan confirmation: every 5 minutes (research takes time)

    line 179
  8. Very specific:

    If isRunning: false but no report was generated:

    line 204
  9. Very specific:

    Handle timeouts: If sendMessage times out, check getMessages — the AI may still be running.

    line 288
  10. Very specific:

    Error recovery: Check status field from sendMessage: "running" | "saved_no_ai" | "ai_failed".

    line 289
  11. Very specific:

    Persona panels: Use panel_search to find curated groups, pass panelId to study_create.

    line 291

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

atypica Research

Access atypica.ai's multi-agent research framework for understanding consumer emotions, market perceptions, and decision preferences.

Calling Methods

Three ways to call the Research API, depending on your environment:

Method 1: MCP Client (Recommended for AI assistants)

If tools starting with atypica_ are already available, the MCP server is configured. Otherwise, configure it:

Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json):

{
  "mcpServers": {
    "atypica-research": {
      "transport": "http",
      "url": "https://atypica.ai/mcp/study",
      "headers": {
        "Authorization": "Bearer atypica_xxx"
      }
    }
  }
}

Method 2: curl + jq (Best for scripting without MCP client)

When you don't have an MCP client, curl + jq is the most flexible combination. All MCP tools are plain JSON-RPC over HTTP:

export ATYPICA_TOKEN="atypica_xxx"
export ATYPICA_ENDPOINT="https://atypica.ai/mcp/study"

# Generic pattern: call any tool
call_tool() {
  local tool_name="$1"
  local args="$2"
  curl -s -X POST "$ATYPICA_ENDPOINT" \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer $ATYPICA_TOKEN" \
    -d "{\"jsonrpc\":\"2.0\",\"method\":\"tools/call\",\"params\":{\"name\":\"$tool_name\",\"arguments\":$args},\"id\":1}"
}

# Create research session
call_tool atypica_study_create '{"content":"Research young people coffee preferences"}' | jq '.result.structuredContent'

# Get messages (tail=5 for last 5 parts)
call_tool atypica_study_get_messages '{"userChatToken":"abc123","tail":5}' \
  | jq '.result.structuredContent | {isRunning, messageCount: (.messages | length)}'

# Check for pending interactions
call_tool atypica_study_get_messages '{"userChatToken":"abc123","tail":3}' \
  | jq '.result.structuredContent.messages[-1].parts[] | select(.state == "input-available") | {type, toolCallId}'

# Get report
call_tool atypica_study_get_report '{"token":"report_xxx"}' | jq '.result.structuredContent | {title, shareUrl}'

# Search panels
call_tool atypica_panel_search '{"query":"coffee"}' | jq '.result.structuredContent.data[] | {panelId, title, personaCount}'

Tips:

  • Use jq '.result.structuredContent' to extract the structured response
  • Use jq '.result.content[0].text' to get the human-readable summary
  • Pipe into jq -r for raw strings (no quotes)
  • Use tail parameter in get_messages (3-5 parts) instead of fetching everything

Method 3: mcp-call.sh (Bundled convenience script)

A standalone script that wraps curl+jq with nicer output, error handling, and options:

export ATYPICA_TOKEN="atypica_xxx"

# Create research session
scripts/mcp-call.sh atypica_study_create '{"content":"Research coffee preferences"}'

# Get messages with tail
scripts/mcp-call.sh atypica_study_get_messages '{"userChatToken":"abc123","tail":5}'

# Output as raw JSON
scripts/mcp-call.sh atypica_study_get_messages '{"userChatToken":"abc123"}' -o json

# Write to file
scripts/mcp-call.sh atypica_study_get_report '{"token":"report_xxx"}' -f report.json

# Verbose mode
scripts/mcp-call.sh atypica_study_create '{"content":"test"}' -v

Options: -t <token>, -o text|json|structured|auto, -f <file>, -v, -h

See scripts/mcp-call.sh for full documentation.

Core Workflow

  1. Create research session with initial query
  2. Send messages to drive research forward (AI executes asynchronously in background)
  3. Poll get_messages — check isRunning and look for pending interactions
  4. Handle interactions by submitting tool results (plan confirmation, user choices)
  5. Retrieve artifacts (reports, podcasts) when research completes
study_create → send_message → [AI runs in background]
                                    ↓
                              get_messages (poll)
                                    ↓
                    isRunning=true? → wait, poll again
                    isRunning=false? → check for:
                      - pending interaction → submit tool result → send_message
                      - generateReport output → get_report (done!)
                      - no report, no interaction → send "continue" message

Available Tools

Session Management

ToolDescription
atypica_study_createCreate research session with initial query and optional panel/attachments
atypica_study_send_messageSend user text or tool result submission, starts/resumes AI execution
atypica_study_get_messagesGet conversation history + execution status (isRunning)
atypica_study_listList historical research sessions with pagination

Artifacts

ToolDescription
atypica_study_get_reportGet research report (HTML content + share URL)
atypica_study_get_podcastGet podcast (audio URL + script + share URL)

Panels & Personas

ToolDescription
atypica_panel_searchSearch persona panels (curated groups of AI personas)
atypica_persona_searchText search for individual AI personas
atypica_persona_getGet persona details including full prompt

File Upload

ToolDescription
atypica_get_upload_credentialsGet presigned URL for file upload (images, PDFs, CSVs)

For complete input/output schemas, see references/api-reference.md.

Understanding Research State from Messages

All research state is in the messages — no separate status API. After get_messages:

1. Check execution status

call_tool atypica_study_get_messages '{"userChatToken":"abc","tail":5}' \
  | jq '.result.structuredContent.isRunning'
  • true → AI working in background, wait and poll again
  • false → Can interact, check for pending tool calls or completion

Polling strategy:

  • Before plan confirmation: every 30 seconds
  • After plan confirmation: every 5 minutes (research takes time)

2. Detect pending interactions

# Find tool calls that need input
call_tool atypica_study_get_messages '{"userChatToken":"abc","tail":3}' \
  | jq '.result.structuredContent.messages[-1].parts[] | select(.state == "input-available") | {type, toolCallId}'

Two interaction types require user input:

  • tool-requestInteraction — User choice/input (single or multi-question)
  • tool-makeStudyPlan — Plan confirmation (approve or reject)

3. Check research completion

# Look for report/podcast output
call_tool atypica_study_get_messages '{"userChatToken":"abc"}' \
  | jq '.result.structuredContent.messages[].parts[] | select(.type == "tool-generateReport" and .state == "output-available") | .output.reportToken'

4. Continue stopped research

If isRunning: false but no report was generated:

call_tool atypica_study_send_message '{
  "userChatToken":"abc",
  "message":{"role":"user","lastPart":{"type":"text","text":"Please continue the research"}}
}'

User Interactions

Two tools require user input. Detect them by state === "input-available" in message parts.

requestInteraction — User Choice/Input

Two modes:

  • Single-question: input.question + input.options present
  • Multi-question: input.questions array present (2+ related questions)

Single-question submit:

{
  "userChatToken": "...",
  "message": {
    "id": "msg_2",
    "role": "assistant",
    "lastPart": {
      "type": "tool-requestInteraction",
      "toolCallId": "call_abc",
      "state": "output-available",
      "input": { "question": "...", "options": [...], "maxSelect": 1 },
      "output": {
        "answer": ["23-28"],
        "plainText": "User selected: 23-28"
      }
    }
  }
}

answer is always string[]. maxSelect: 1 = single-choice, 2+ = multi with limit, omitted = unlimited.

Multi-question submit:

{
  "output": {
    "answers": [
      { "label": "Gender", "answer": ["Female"] },
      { "label": "Age", "answer": ["25-34"] }
    ],
    "plainText": "Gender: Female\nAge: 25-34"
  }
}

makeStudyPlan — Plan Confirmation

{
  "output": {
    "confirmed": true,
    "plainText": "User confirmed research plan"
  }
}

Set confirmed: false to reject and restart planning.

Study Types

  • userResearch — User research with personas, interviews, discussions, reports
  • fastInsight — Quick insights with deep research and podcast generation
  • productRnD — Product research & development with audience and social trends
  • panelOnly — Build a persona panel without running a full study

Sessions start in Planning phase automatically — AI clarifies intent via requestInteraction before creating a plan with makeStudyPlan.

Best Practices

  1. Async execution: sendMessage starts the run and returns immediately. Poll getMessages for results.
  2. Use tail parameter: tail: 3-5 in get_messages for efficiency. Increase if you need more context.
  3. Handle timeouts: If sendMessage times out, check getMessages — the AI may still be running.
  4. Error recovery: Check status field from sendMessage: "running" | "saved_no_ai" | "ai_failed".
  5. Upload first: Files must be uploaded via get_upload_credentials before attaching. Max 5 images, 3 docs, 3MB each, 50MB total.
  6. Persona panels: Use panel_search to find curated groups, pass panelId to study_create.
  7. Parallelize independent reads: get_report and get_podcast can run concurrently. Same for fetching multiple persona details.
  8. Cache persona data locally: Persona prompts don't change often — avoid re-fetching the same personaId repeatedly.

Performance Expectations

  • Plan Mode: 5-10s
  • Fast Insight: 20-40s
  • Full Study/Product R&D: 30-120s
  • Message/persona retrieval: < 2s

Reference Documentation

IMPORTANT: Read references/api-reference.md in full before making any API calls. Do not read it partially or look up individual tools on demand — the notes and constraints for each tool inform how other tools behave. Reading the complete reference upfront prevents subtle mistakes that come from missing cross-tool dependencies.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.