Inspiration

I run @kai.ligraphy, a Chinese calligraphy Instagram account. Calligraphy, for me, is a practice of mindfulness and presence, and sharing it is a way of bringing a little peace and joy to people's lives. But as a creator, I often found myself guessing: which styles resonate most? What content connects with people? What do they actually want to see more of?

When I saw this hackathon, I realised I could build something that solves both problems at once: an AI assistant that helps my audience explore Chinese calligraphy through natural conversation, while also helping me understand my own content so I can keep creating work that matters.

What it does

The Kai.ligraphy AI Assistant is a conversational agent that lets anyone explore Chinese calligraphy and the @kai.ligraphy Instagram account through natural conversation. For the audience: ask "What is 草書?" or "Tell me about the Four Treasures of the study" and it draws from a curated knowledge base of calligraphy styles, tools, and masters. For me as the creator: ask "Which of my posts get the most engagement?" or "Find my posts about ink technique" and it semantically searches 307 historical Instagram posts to surface real, data-grounded answers, helping me understand what brings people joy so I can create more of it.

How I built it

I started by building a custom Instagram MCP server using FastMCP, connecting to the Instagram Graph API to fetch live post data, engagement stats, and hashtag trends. I then set up an Elastic Cloud Serverless project and indexed all 307 Instagram posts alongside 13 Chinese calligraphy knowledge articles covering the five main scripts (楷書, 行書, 草書, 隸書, 篆書), the Four Treasures (文房四宝), and famous calligraphers like 王羲之. A second custom MCP server wraps the Elasticsearch Python client to expose semantic search over this index. Both MCP servers are wired into a single Google ADK agent powered by Gemini 2.5 Flash and deployed to Google Cloud Run.

Challenges I ran into

The biggest challenge was discovering that Elastic Agent Builder's built-in MCP server endpoint was not easily accessible from the Kibana UI, so I pivoted to building a custom stdio MCP server wrapping the Elasticsearch Python client directly, which turned out to be cleaner and more controllable. I also hit a subtle Python import ordering issue where my_agent/__init__.py was importing agent.py before load_dotenv had run in the indexing script, causing environment variable lookup failures that took some debugging to trace.

Accomplishments that I am proud of

I got two MCP servers running simultaneously inside a single Google ADK agent: one hitting a live API in real time, one doing semantic search over a persistent knowledge layer, with the agent seamlessly deciding which to use based on the question. The moment you ask "Which calligraphy style do I post about most?" and watch it combine both sources to give a grounded, thoughtful answer feels genuinely rewarding.

What I learned

Building with MCP made the agent architecture surprisingly modular. Adding Elasticsearch as a second data source was as simple as adding a second MCPToolset. Elastic's semantic_text field type made semantic search accessible without any ML expertise, handling ELSER embedding generation automatically on ingest. Most personally, I found that asking the agent "which of my posts resonate most with people?" and getting a real, data-grounded answer is exactly the creative feedback loop that helps a maker keep going.

What's next for Kai.ligraphy AI Assistant

Currently, Kai.ligraphy is only a proof of concept. I want to expand the agent to write back insights into Elasticsearch over time, building a growing memory of what resonates, what styles trend, and what captions drive engagement, so it becomes an ever-smarter creative partner. Longer term, I would like to make it available to other calligraphy creators so they can build the same kind of deep, searchable relationship with their own content and audience.

Built With

Share this project:

Updates