← Blog

How to Build a Research Assistant With Claude

2026-10-28 · 5 min read · SubToAPI Team

A research assistant built on Claude is an application that takes a question, breaks it into sub-tasks, pulls information from sources like web search, documents, or internal databases, and returns a synthesized, cited answer. You're not building a chatbot that just talks about research — you're building a system that retrieves, reasons, and reports.

This guide walks through the actual architecture: how to structure the prompt, when to use tool use versus retrieval-augmented generation (RAG), how to handle multi-step queries, and how to get the assistant into production as an API your team or product can call.

What a research assistant actually needs to do

Before writing code, define the loop. A working research assistant typically does four things repeatedly until it has enough information:

  1. Decompose the question into smaller, answerable parts.
  2. Retrieve relevant information (search, documents, databases).
  3. Evaluate whether the retrieved information actually answers the sub-question.
  4. Synthesize a final answer with sources attached.

Claude is good at steps 1, 3, and 4 out of the box — reasoning about what to look up next and writing a coherent summary. Step 2 (retrieval) is where you need to give Claude tools or feed it context, because Claude doesn't have live internet access or a database connection on its own.

Choose your retrieval strategy

There are two common patterns, and most real assistants use both.

RAG (retrieval-augmented generation): You run the search yourself — against a vector database, Elasticsearch, internal docs — and inject the top results into the prompt as context. This works well when you control a fixed corpus (internal wiki, support tickets, legal documents).

Tool use / function calling: You define tools like search_web, fetch_url, or query_database, and let Claude decide when and how to call them, read the results, and decide whether to call another tool. This works better for open-ended research where the assistant needs to chase down follow-up questions it didn't anticipate.

A production research assistant usually combines both: tool use for dynamic lookups, with a RAG layer behind one of the tools for anything from your own data.

Designing the tools

Here's a minimal tool schema for a web-search-backed research assistant:

{
  "name": "search_web",
  "description": "Search the web for recent or factual information and return titles, URLs, and snippets.",
  "input_schema": {
    "type": "object",
    "properties": {
      "query": { "type": "string" },
      "max_results": { "type": "integer", "default": 5 }
    },
    "required": ["query"]
  }
}

Pair it with a fetch_page tool that takes a URL and returns cleaned text, so Claude can go from snippet to full source when a summary isn't enough. Keep tool outputs compact — truncate long pages before returning them, since every token you return gets fed back into the next turn.

The multi-step loop

The core of a research assistant is a loop, not a single API call:

let messages = [{ role: "user", content: userQuestion }];

while (true) {
  const response = await client.messages.create({
    model: "claude-sonnet-4",
    max_tokens: 1024,
    tools: [searchWebTool, fetchPageTool],
    messages
  });

  messages.push({ role: "assistant", content: response.content });

  const toolUse = response.content.find(c => c.type === "tool_use");
  if (!toolUse) {
    // Claude has enough information — this is the final answer
    break;
  }

  const result = await runTool(toolUse.name, toolUse.input);

  messages.push({
    role: "user",
    content: [{ type: "tool_result", tool_use_id: toolUse.id, content: result }]
  });
}

Claude will call tools repeatedly — searching, fetching, searching again with a refined query — until it decides it has enough to answer. Set a hard cap on iterations (5–8 is usually plenty) to avoid runaway loops on ambiguous questions. For the full mechanics of handling tool calls and results, see /docs/tools.

Prompting for research quality, not just answers

System prompt matters a lot here. Be explicit about what counts as a good answer:

You are a research assistant. For every claim in your final answer,
cite the source URL it came from. If sources disagree, say so explicitly
instead of picking one silently. If you cannot find reliable information
after searching, say that clearly rather than guessing.

Without this, Claude will happily produce a confident, unsourced summary. With it, you get something closer to an actual research output: claims tied to sources, disagreements flagged, and gaps acknowledged instead of papered over.

Streaming for long research sessions

Research tasks that involve several tool calls can take 10–30 seconds before the final answer is ready. If you're building a UI, stream the response so users see progress — tool calls happening, partial synthesis — rather than staring at a spinner. See /docs/streaming for how streamed events map to tool use and text deltas.

Getting this into production

A prototype that calls the Anthropic API directly from a script works for testing, but a real research assistant — one other people on your team or in your product rely on — needs API key management, usage visibility, and a stable endpoint that doesn't change when you swap models or rotate credentials.

This is where SubToAPI fits in: it turns your existing Claude access into a standard HTTPS API with its own sub_live_... keys, so your research assistant backend talks to one stable endpoint instead of juggling raw provider credentials. You get streaming, tool use, and per-key usage metadata out of the box, plus team seats if more than one person needs to issue keys or watch usage. Setup takes about the same time as reading this article — start at /signup, or check /docs/quickstart for the first API call.

A basic call once you have a key looks like:

curl https://api.subtoapi.app/v1/messages \
  -H "Authorization: Bearer $SUBTOAPI_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "claude-sonnet-4",
    "max_tokens": 1024,
    "tools": [{"name": "search_web", "description": "...", "input_schema": {...}}],
    "messages": [{"role": "user", "content": "Summarize recent research on battery recycling efficiency"}]
  }'

Full request and response shapes are documented at /docs/messages, and pricing for Solo, Team, and Scale plans is at /pricing.

questions

Does Claude have internet access by default? No. Claude has no built-in browsing. To do live research, you give it a search_web or similar tool and run the actual HTTP requests yourself, returning results as tool output.

Should I use RAG or tool use for a research assistant? Use RAG for a fixed, known corpus like internal docs. Use tool use when the assistant needs to decide dynamically what to look up next, including follow-up searches it couldn't have planned in advance.

How do I stop the assistant from making things up? Instruct it explicitly to cite sources for every claim and to say when it can't find reliable information, rather than filling gaps with a confident guess. Pairing this with real tool results, not just training knowledge, cuts hallucination significantly.

Turn your Claude access into an HTTPS API

SubToAPI gives you application API keys, streaming, tool use and usage insights on top of your existing Claude access — set up in minutes.

Start free  Read the quickstart →