Skip to main content
Paul Welty, PhD AI, WORK, AND STAYING HUMAN

2026-03-31 — MCP server, bulk ops, and Eli comes alive

What shipped today

The full MCP server went from zero to complete in a single session. Four sub-issues (#648–#651) decomposed from the parent (#645), each implemented and shipped in sequence: scaffold with auth and stdio transport, article search and detail tools, briefing tools, and feeds/profile tools. The server now exposes 8 tools — ping, search_articles, get_article, list_briefings, get_briefing, list_feeds, list_search_terms, and get_profile — all scoped to the authenticated user via API key. Any MCP-compatible AI assistant can now query a user’s Eclectis data. The engine test suite grew from 281 to 310, all passing.

Bulk operations landed on the search terms page (#644). Users can now select multiple terms (with select all/deselect all), then enable, disable, or delete in bulk. The active status indicator changed from a checkbox to a colored dot — green for active, grey for disabled — since the checkbox is now used for selection. Two new server actions (bulkToggleSearchTerms, bulkDeleteSearchTerms) handle the backend with proper user scoping. Web tests held at 539 passing.

The session’s second half was about identity and communication. Eclectis now has a persona — Eli — who represents the product in Slack and agency interactions. Eli joined the Synaxis workspace’s #eclectis channel as a custom bot, had a multi-turn conversation with Trina (the Synaxis PM bot) about product positioning, and created a GitHub issue (#652) from the conversation. The Slack integration works via the MCP plugin for reading and the bot token for posting. A 2-minute polling cron kept Eli responsive during the session.

Completed

  • #645 — MCP server for Eclectis intelligence data (decomposed → closed)
  • #648 — MCP server scaffold with auth and stdio transport
  • #649 — search_articles and get_article tools
  • #650 — briefing tools (get_briefing, list_briefings)
  • #651 — list_feeds, list_search_terms, get_profile tools
  • #644 — Bulk operations on search terms
  • #646 — Briefings: bold takeaways, grey detail (from previous session, pushed today)
  • #647 — Admin user detail: inline edit view (from previous session, pushed today)

Carry-over

  • #652 — Write MCP server setup guide for docs (ready-for-prep, created from Slack conversation)
  • Eli bot real-time — Currently polling via cron; needs proper event relay for real-time Slack responses. Options discussed: Python bot as event relay → Claude session as brain, or hybrid approach.
  • Eli bot token storage — Token is currently passed inline; needs to be stored securely (env var or secrets manager)

Risks

  • AI-to-AI loop potential — Eli polling + Trina auto-responding could create infinite loops. Current mitigation: skip reply if last message is from Eli. Needs hardening if polling frequency increases.
  • Bot token in cron prompt — The Slack bot token was embedded in the cron prompt text. Not persisted (session-only cron) but worth noting for the real-time implementation.

Flags and watch-outs

  • MCP server auth resolves user by API key at startup — users on the free plan already have API keys (BYOK), but pro users may not have one set. The MCP setup guide should clarify this.
  • The Slack MCP plugin authenticates as Paul (OAuth), not as a bot. Reading is fine but messages posted via MCP show as Paul with “Sent using Claude” badge. Bot token posts correctly as Eli.

Next session

  • Ship #652 — MCP setup guide. Short doc: install command, env var, tool list, example query. Link from README.
  • Eli real-time architecture — Decide on event relay approach. Simplest: Python script that listens to Slack Events API, writes to commands table, Claude session picks up and responds.
  • Continue dev-loop — Queue has #652 (ready-for-prep) plus backlog items. No blockers.

Why customer tools are organized wrong

This article reveals a fundamental flaw in how customer support tools are designed—organizing by interaction type instead of by customer—and explains why this fragmentation wastes time and obscures the full picture you need to help users effectively.

Infrastructure shapes thought

The tools you build determine what kinds of thinking become possible. On infrastructure, friction, and building deliberately for thought rather than just throughput.

Server-side dashboard architecture: Why moving data fetching off the browser changes everything

How choosing server-side rendering solved security, CORS, and credential management problems I didn't know I had.

The work of being available now

A book on AI, judgment, and staying human at work.

The practice of work in progress

Practical essays on how work actually gets done.

The case for corporate amnesia

Most organizations worship institutional memory. But what if the thing they're preserving is mostly decay?

Your design philosophy is already written

Builders who work across multiple projects leave fingerprints everywhere. The same mind solves the same problem differently in every domain — and usually doesn't notice. You need someone to read it back to you.

The day nothing satisfying happened

The most productive day in an organization's life usually looks like nothing happened. No launches, no features, no announcements. Just people quietly making the existing work more honest.