GitDealFlow × Letta
Stateful VC analyst agents with persistent memory of every startup they've scouted.
POST https://signals.gitdealflow.com/api/a2aWhy ship this
Letta (formerly MemGPT) is the only mainstream agent framework where memory is a first-class primitive. For venture work, that maps perfectly: deal flow is fundamentally a longitudinal exercise, you watched this team six months ago, the signal was warm, you passed; now the signal is breakout and you want to remember why you hesitated. Stateless agents lose that thread on every restart.
Wire GitDealFlow into a Letta agent and the agent's archival memory becomes a personal scouting database. Every startup it looks up gets remembered. Every methodology citation gets indexed. When you ask 'have I seen Roboflow before?', the agent can answer with the exact prior context, plus the live commit-velocity delta since you last looked. That's a VC analyst that compounds.
What you can build
Persistent watchlist memory
Every startup the agent surfaces is written to archival memory automatically. Restart the server, the watchlist survives. Ask 'who have I been tracking?' and the agent recalls.
Self-editing core memory
Letta agents can edit their own persona block. Start with 'I am a venture analyst' and after 50 conversations the agent has refined its own thesis prompt, 'I focus on dev-tools breakouts under 10 contributors.'
Recall rather than re-fetch
Letta's RAG over conversation history means follow-ups don't burn tool calls. 'What did Modular's velocity look like last week?' hits memory, not the API. Faster, cheaper, and capture-able context.
Server-mode for team agents
Run Letta server, expose REST endpoints for the team, every analyst hits the same shared agent with the same accumulated knowledge. The crew's deal flow IQ goes up over time.
Letta agent with GitDealFlow tool
# pip install letta-client letta requests
# Run `letta server` first, then:
from letta_client import Letta
import requests
A2A = "https://signals.gitdealflow.com/api/a2a"
# Define the tool as a plain Python function. Letta uses the docstring
# and signature to auto-generate the JSON schema.
def gitdealflow_query(skill: str, args: dict = None) -> dict:
"""Live VC engineering signals from GitDealFlow.
Args:
skill (str): One of get_trending_startups, search_startups_by_sector,
get_startup_signal, get_signals_summary, get_methodology.
args (dict): Skill-specific arguments (e.g. {"sector": "ai-ml"}).
Returns:
dict: JSON-RPC response with .result.artifacts[0].parts[0].data
containing the structured payload.
"""
body = {
"jsonrpc": "2.0", "id": 1,
"method": "message/send",
"params": {"message": {"role": "user", "parts": [
{"kind": "data", "data": {"skill": skill, "args": args or {}}},
]}},
}
return requests.post(A2A, json=body, timeout=15).json()
client = Letta(base_url="http://localhost:8283")
# Upload tool, then create a stateful agent that uses it
tool = client.tools.upsert_from_function(func=gitdealflow_query)
agent = client.agents.create(
name="vc_scout",
memory_blocks=[
{"label": "persona", "value": "I am a VC analyst that tracks engineering acceleration across 350+ startups. I remember every startup I've seen and refine my thesis over time."},
{"label": "human", "value": "The user is an investor or dealmaker who writes angel checks but doesn't read code."},
],
tool_ids=[tool.id],
model="openai/gpt-5.4",
embedding="openai/text-embedding-3-small",
)
response = client.agents.messages.create(
agent_id=agent.id,
messages=[{"role": "user", "content": "What's accelerating in fintech this week?"}],
)
print(response.messages[-1].content)Persistent scouting memory across sessions
# Same agent, weeks later. The agent remembers prior context.
from letta_client import Letta
client = Letta(base_url="http://localhost:8283")
# Reuse the agent_id from the prior session.
agent_id = "agent-..." # persisted in your DB
# Letta auto-recalls relevant archival entries. The agent will:
# 1. Surface that Roboflow was tracked 8 weeks ago at warm signal.
# 2. Re-query GitDealFlow for the *current* signal.
# 3. Compute the delta and reason about it in conversation.
response = client.agents.messages.create(
agent_id=agent_id,
messages=[{"role": "user", "content": "Has anything I tracked changed materially?"}],
)
print(response.messages[-1].content)
# Inspect the agent's accumulated archival memory.
archival = client.agents.archival_memory.list(agent_id=agent_id, limit=20)
for entry in archival:
print(entry.text[:160])Five prompts to try first
- ›What's accelerating in fintech this week? Remember the names for next time.
- ›Has anything I tracked changed materially since last month?
- ›Show me my entire watchlist with the current commit velocity for each.
- ›Refine your persona block: focus on dev-tools breakouts under 10 contributors.
- ›Cite the SSRN methodology and store it in your archival memory for future reference.
FAQ
Does Letta have native MCP support?+
As of late 2025, Letta exposed an MCP-compatible interface for tool definitions, and the @gitdealflow/mcp-signal package can be wrapped in a Letta tool. The simplest path remains a plain Python function tool that hits the A2A endpoint, Letta's tool auto-generation reads the docstring and signature to build the schema for the LLM.
Why use Letta over LangChain for VC scouting agents?+
Memory. LangChain agents are stateless by default; you have to bolt on a vector store and engineer the recall logic yourself. Letta agents have core memory + archival memory + recall memory built in, plus self-editing primitives. For a deal-flow agent that compounds knowledge over months, Letta is the path of least resistance.
Can I run Letta server in production for a team?+
Yes, Letta ships a REST API server (`letta server`) that supports multi-user agent management, persistent storage (SQLite or Postgres), and authentication. Multiple analysts can share one VC-scout agent or fork into per-user agents that share archival memory.
Gotchas
- Letta's archival memory grows over time; if you're cost-sensitive, set archival_memory_size limits in agent config or periodically prune via the API.
- Tool docstrings are the single source of truth for JSON schema, keep arg descriptions tight and accurate or the LLM picks wrong skills.
- Local-only mode (no server) works for prototyping but loses persistence across script restarts; run `letta server` for stateful agents.
References
- Letta docs
- Letta on GitHub
- MemGPT paper (UC Berkeley)
- Our AgentCard (A2A descriptor)
- MCP HTTP endpoint same five skills, Streamable HTTP, no auth.
- Methodology paper (SSRN)
Other frameworks
When the free signal isn’t enough
The A2A and MCP endpoints above are free and ungated, that’s where every Letta agent should start. When you need report-grade enrichment on a named startup, the deep signal runs at €0.19 / call €19 buys 100 credits, credits never expire, and a miss (an org we don’t track) is free.
Prefer to pay per call with no API key? The same endpoint speaks x402 settle in USDC on Base, $0.19/call, no signup.
Stuck on the wire-up?
Email signals@gitdealflow.com, replies within 24 hours, EU business time. Include the framework name and the error in the message body and a snippet of your tool definition.
Email support