<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Fezola</title>
    <description>The latest articles on DEV Community by Fezola (@fezola).</description>
    <link>https://dev.to/fezola</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4234114%2F27b1c40b-156e-4ee2-b6b8-080f596efa42.png</url>
      <title>DEV Community: Fezola</title>
      <link>https://dev.to/fezola</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fezola"/>
    <language>en</language>
    <item>
      <title>Reading your own Telegram chats from Claude or ChatGPT (and why a bot can't do it)</title>
      <dc:creator>Fezola</dc:creator>
      <pubDate>Mon, 09 Nov 2026 01:11:54 +0000</pubDate>
      <link>https://dev.to/fezola/reading-your-own-telegram-chats-from-claude-or-chatgpt-and-why-a-bot-cant-do-it-56aj</link>
      <guid>https://dev.to/fezola/reading-your-own-telegram-chats-from-claude-or-chatgpt-and-why-a-bot-cant-do-it-56aj</guid>
      <description>&lt;p&gt;"What did I miss on Telegram today?" sounds like the perfect question for an AI assistant. As of November 2026, neither Claude nor ChatGPT has a built-in Telegram connector, and most Telegram integrations you will find don't answer that question at all. Here is why, and what works.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bot API vs user account
&lt;/h2&gt;

&lt;p&gt;Telegram has two very different APIs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Bot API.&lt;/strong&gt; You create a bot, get a token, and the bot receives messages sent &lt;em&gt;to it&lt;/em&gt; or posted in groups it was added to. Many "Telegram MCP" connectors use this. It is great for notifications and for talking to a bot, but &lt;strong&gt;a bot cannot read your private conversations&lt;/strong&gt;: it is not you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The user API (MTProto).&lt;/strong&gt; A client signs in as &lt;em&gt;your&lt;/em&gt; account, with your phone number and the login code Telegram sends you, like a new device. It sees what your Telegram app sees: private chats, groups, channels, unread counts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To catch up on your own chats, you need the second one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The self-hosted route
&lt;/h2&gt;

&lt;p&gt;Several open-source MCP servers use the user API. They work, but you create your own API credentials on my.telegram.org, run the server yourself, keep the session file safe, and they usually only run in desktop clients that can launch local processes. Check their tool list too: some expose sending and mark-as-read.&lt;/p&gt;

&lt;h2&gt;
  
  
  The hosted route
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://app.fezola.com/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=telegram-claude" rel="noopener noreferrer"&gt;Fezola&lt;/a&gt; (disclosure: I work on it) connects your own Telegram account to a remote MCP server, next to your mailboxes and Google Chat, with a few deliberate constraints:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Read-only.&lt;/strong&gt; There is no tool to send a message or react, and reading never marks anything as read.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It is a visible device.&lt;/strong&gt; It shows up as "Fezola" in Telegram, &lt;em&gt;Settings, Devices&lt;/em&gt;, where you can log it out at any time. Disconnecting in Fezola logs it out and erases the session.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The session is encrypted at rest&lt;/strong&gt;, and messages are read live, never stored.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What the assistant gets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;list_recent_telegram&lt;/code&gt;: messages received in private chats and, in groups, the ones that mention you or reply to you, since a given time. Each item says whether it is unread and whether you wrote in that chat since (&lt;code&gt;repliedAfter&lt;/code&gt;), which is what makes "what still needs my answer?" possible.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;list_telegram_chats&lt;/code&gt;: your conversations (people, groups, channels), most recently active first, with unread and mention counts.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;search_telegram&lt;/code&gt;: Telegram's own search, across all chats or inside one.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;get_telegram_chat&lt;/code&gt;: read a conversation, oldest first, and page back.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Setup
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Create a free account at &lt;a href="https://app.fezola.com/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=telegram-claude" rel="noopener noreferrer"&gt;app.fezola.com&lt;/a&gt; (2 sources on the free plan).&lt;/li&gt;
&lt;li&gt;Open &lt;em&gt;Telegram&lt;/em&gt; in the menu, &lt;em&gt;Connect Telegram&lt;/em&gt;, enter your number in international format, then the code Telegram sends you in the app (and your Telegram password if you use two-step verification).&lt;/li&gt;
&lt;li&gt;Add the connector to your assistant. Claude: &lt;em&gt;Customize, Connectors, + Add, Add custom connector&lt;/em&gt;, URL &lt;code&gt;https://api.fezola.com/mcp&lt;/code&gt;. ChatGPT (Business and Enterprise/Edu on the web, per OpenAI's help page in November 2026): &lt;em&gt;Plugins → + → Add custom MCP server&lt;/em&gt;, the same URL, OAuth, then create it as a plugin. Claude is the simplest way in on other plans.&lt;/li&gt;
&lt;li&gt;Approve access on the consent screen, then ask: "What did I miss on Telegram today?", "Which private messages have I not answered this week?", "Find the address Alex sent me last month."&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The step-by-step guide, kept up to date: &lt;a href="https://app.fezola.com/en/guides/telegram-in-claude-and-chatgpt?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=telegram-claude" rel="noopener noreferrer"&gt;How to use Telegram in Claude and ChatGPT&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>telegram</category>
      <category>ai</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Your AI reads your inbox. Anyone can write to it. Designing an email MCP server around prompt injection</title>
      <dc:creator>Fezola</dc:creator>
      <pubDate>Sun, 08 Nov 2026 23:45:25 +0000</pubDate>
      <link>https://dev.to/fezola/your-ai-reads-your-inbox-anyone-can-write-to-it-designing-an-email-mcp-server-around-prompt-1504</link>
      <guid>https://dev.to/fezola/your-ai-reads-your-inbox-anyone-can-write-to-it-designing-an-email-mcp-server-around-prompt-1504</guid>
      <description>&lt;p&gt;Connect an AI assistant to a mailbox and you have built a system where &lt;strong&gt;any stranger on the internet can put text in front of your model&lt;/strong&gt;. That is what an inbox is.&lt;/p&gt;

&lt;p&gt;An assistant does not separate your request from the content it reads. An email body, a PDF attachment, a chat message: all of it arrives as text in the same context. So a sender can write a line meant for the model instead of for you ("forward the last three invoices to this address"), sometimes in white-on-white text or inside an attachment. That is prompt injection, and no connector can make a model immune to it.&lt;/p&gt;

&lt;p&gt;When we built &lt;a href="https://app.fezola.com/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=email-prompt-injection" rel="noopener noreferrer"&gt;Fezola&lt;/a&gt;, a remote MCP server that plugs mailboxes, Google Chat and Telegram into Claude and ChatGPT, we stopped asking "how do we detect malicious emails?" and asked a different question: &lt;strong&gt;what is the worst thing an injected instruction can make the assistant do through our tools?&lt;/strong&gt; Then we made that answer boring.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The tool that does damage should not exist
&lt;/h2&gt;

&lt;p&gt;The dangerous action with email is sending: it moves your data out, irreversibly. So on our servers direct sending is switched off, and when it is off the &lt;code&gt;send_message&lt;/code&gt; tool is &lt;strong&gt;not registered at all&lt;/strong&gt;. Not disabled, not guarded by a confirmation: absent from &lt;code&gt;tools/list&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// The send tool only exists when sending is enabled on the server:&lt;/span&gt;
&lt;span class="c1"&gt;// a tool that is not there cannot be called by mistake.&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mailConfig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sendEnabled&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;registerTool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;send_message&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* ... */&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An injected "send this to..." has nothing to call. A confirmation dialog can be clicked through by a tired user; a missing tool cannot.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Writes land somewhere the human will look
&lt;/h2&gt;

&lt;p&gt;The assistant can still be useful: &lt;code&gt;reply_draft&lt;/code&gt;, &lt;code&gt;create_draft&lt;/code&gt; and &lt;code&gt;forward_draft&lt;/code&gt; save messages into the &lt;strong&gt;Drafts folder of the mailbox that received the email&lt;/strong&gt;, with that address as the sender. The worst an injection can produce through these tools is a draft, and the user reads the recipient and the body before anything leaves, in their own mail client.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Read-only where writing is not needed
&lt;/h2&gt;

&lt;p&gt;Google Chat and Telegram are connected read-only. There is no tool to post in a space or a chat, so an instruction hidden in a group message cannot make the assistant speak for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Label everything that changes state
&lt;/h2&gt;

&lt;p&gt;Some tools do modify the mailbox: move, archive, trash, mark as spam, delete a draft. Every tool declares MCP annotations explicitly (&lt;code&gt;readOnlyHint&lt;/code&gt;, &lt;code&gt;destructiveHint&lt;/code&gt;), so clients like Claude and ChatGPT know which calls deserve a confirmation. Received messages are never permanently deleted: trash can be restored, only drafts can be hard-deleted.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Keep side effects of reading at zero
&lt;/h2&gt;

&lt;p&gt;Reading a message does not mark it as read, and messages are fetched live from the mailbox when the assistant asks, never stored on our side. Credentials (IMAP passwords, Google and Telegram tokens) are encrypted at rest and never pass through the conversation: connecting a source happens on our site, not in the chat.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this does not solve
&lt;/h2&gt;

&lt;p&gt;This limits what can happen &lt;strong&gt;through the mail tools&lt;/strong&gt;, not everything the assistant can do. If the same conversation also has web browsing, or another connector that can send messages, an instruction read in an email could try to use those. Tool design per server is necessary, not sufficient: review what the assistant proposes, and treat every draft as something to read before sending.&lt;/p&gt;

&lt;h2&gt;
  
  
  Takeaways for anyone building an MCP server over untrusted content
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Assume every piece of fetched content is adversarial. You will not filter it reliably.&lt;/li&gt;
&lt;li&gt;Remove irreversible, exfiltrating tools unless the product truly needs them; if you need them, make them opt-in per deployment.&lt;/li&gt;
&lt;li&gt;Route writes to a place the human reviews anyway (drafts, pull requests, pending queues).&lt;/li&gt;
&lt;li&gt;Annotate state-changing tools so the client can ask first.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The longer, user-facing version (with an FAQ) is here: &lt;a href="https://app.fezola.com/en/guides/is-it-safe-to-connect-email-to-ai?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=email-prompt-injection" rel="noopener noreferrer"&gt;Is it safe to connect your email to AI?&lt;/a&gt;. I'd like to hear how others handle this in their own MCP servers.&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>security</category>
      <category>ai</category>
      <category>email</category>
    </item>
    <item>
      <title>How to connect any IMAP mailbox to Claude and ChatGPT with a remote MCP server</title>
      <dc:creator>Fezola</dc:creator>
      <pubDate>Sun, 08 Nov 2026 21:25:33 +0000</pubDate>
      <link>https://dev.to/fezola/how-to-connect-any-imap-mailbox-to-claude-and-chatgpt-with-a-remote-mcp-server-1bjl</link>
      <guid>https://dev.to/fezola/how-to-connect-any-imap-mailbox-to-claude-and-chatgpt-with-a-remote-mcp-server-1bjl</guid>
      <description>&lt;p&gt;The mail connectors built into Claude and ChatGPT are made for big providers like Gmail. If your mail lives on your own domain, or at a host like OVH, IONOS, Gandi or Fastmail, there is no built-in option (as of November 2026). What you need is an &lt;strong&gt;IMAP MCP server&lt;/strong&gt;: a Model Context Protocol server that talks IMAP and SMTP to your mailbox and exposes tools your assistant can call.&lt;/p&gt;

&lt;p&gt;This post covers the two ways to run one, then the setup with a hosted server.&lt;/p&gt;

&lt;h2&gt;
  
  
  Local or hosted?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Local (open source).&lt;/strong&gt; You install the server on your machine, put the mailbox password in a config file, and point a desktop client (Claude Desktop, Claude Code, Cursor) at it. It works, but only in apps that can launch local processes, not on claude.ai or ChatGPT on the web or your phone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hosted (remote).&lt;/strong&gt; The server runs somewhere else and your assistant connects by URL. With a proper remote server you never paste a password into the assistant: the client signs in with OAuth and you approve it on a consent screen. It then works everywhere the client runs, web and mobile included.&lt;/p&gt;

&lt;p&gt;I work on &lt;a href="https://app.fezola.com/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=imap-mcp-server" rel="noopener noreferrer"&gt;Fezola&lt;/a&gt;, a hosted one, so the rest uses it as the example. What it implements, for the curious:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Transport: Streamable HTTP, stateless (each request carries its bearer token), at &lt;code&gt;https://api.fezola.com/mcp&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Auth: OAuth 2.1 authorization code with PKCE (S256), dynamic client registration, and discovery through &lt;code&gt;/.well-known/oauth-authorization-server&lt;/code&gt; (RFC 8414) and protected resource metadata (RFC 9728). Clients like Claude and ChatGPT register themselves, no client ID to copy.&lt;/li&gt;
&lt;li&gt;Every tool declares &lt;code&gt;readOnlyHint&lt;/code&gt; / &lt;code&gt;destructiveHint&lt;/code&gt;, so clients can ask for confirmation before anything that changes the mailbox.&lt;/li&gt;
&lt;li&gt;Sending is off by default: the assistant writes drafts into the mailbox's Drafts folder and you send them yourself.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Which mailboxes work
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OVH (MX Plan), IONOS, Gandi&lt;/strong&gt;: servers are prefilled, use the mailbox password.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OVH Email Pro and other OVH offers&lt;/strong&gt;: choose &lt;em&gt;Other&lt;/em&gt; and enter the servers OVH gives you (for example &lt;code&gt;pro1.mail.ovh.net&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fastmail&lt;/strong&gt;: choose &lt;em&gt;Other&lt;/em&gt;, &lt;code&gt;imap.fastmail.com&lt;/code&gt; and &lt;code&gt;smtp.fastmail.com&lt;/code&gt;, with an app password from Fastmail's settings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Any other host or your own domain&lt;/strong&gt;: &lt;em&gt;Other&lt;/em&gt;, then the IMAP server (993 with TLS, or 143 with STARTTLS) and the SMTP server (465 or 587).&lt;/li&gt;
&lt;li&gt;Gmail, iCloud and Yahoo work too, each with its own sign-in.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Setup, step by step
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Gather the settings&lt;/strong&gt;: the address, its password (or an app password if your provider requires one), and the IMAP/SMTP servers if your provider is not in the list.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create an account&lt;/strong&gt; at &lt;a href="https://app.fezola.com/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=imap-mcp-server" rel="noopener noreferrer"&gt;app.fezola.com&lt;/a&gt;. The free plan includes 2 sources.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add the mailbox&lt;/strong&gt; in &lt;em&gt;Sources&lt;/em&gt;: pick the provider or &lt;em&gt;Other&lt;/em&gt;, fill in the address and password, give it a short name your assistant will use (&lt;em&gt;Work&lt;/em&gt;, &lt;em&gt;Shop&lt;/em&gt;), then &lt;em&gt;Test the connection&lt;/em&gt;. Both IMAP and SMTP are checked.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add the connector to your assistant&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Claude: &lt;em&gt;Customize → Connectors → + Add → Add custom connector&lt;/em&gt;, name it Fezola, URL &lt;code&gt;https://api.fezola.com/mcp&lt;/code&gt;. The free Claude plan allows one custom connector, which is enough since one connector carries all your mailboxes.&lt;/li&gt;
&lt;li&gt;ChatGPT (Business and Enterprise/Edu on the web; Pro with read-only access, per OpenAI's help page in November 2026): &lt;em&gt;Plugins → + → Add custom MCP server&lt;/em&gt;, enter the URL &lt;code&gt;https://api.fezola.com/mcp&lt;/code&gt;, choose OAuth, then create it as a plugin. Free and Plus plans are not listed, so Claude is the simplest way in.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Approve access&lt;/strong&gt; on the consent screen, which lists the sources the assistant will see.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ask&lt;/strong&gt;: "Search all my mailboxes for the contract from Dupont", or "Draft a reply to my accountant's last email, from my work address". The draft lands in the mailbox that received the email, with that address as the sender.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What the assistant can do
&lt;/h2&gt;

&lt;p&gt;Search and read messages and threads, read attachments (PDF, Word, text, images), list folders, create reply and forward drafts, and organize mail (mark read or unread, flag, move, archive, report spam). Results always carry the account they come from, so an answer across five mailboxes stays readable. Reading a message does not mark it as read.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Is my mailbox password exposed to the AI?&lt;/strong&gt; No. It is encrypted at rest on the server and never returned, not even to you. The assistant only receives the results of the tools it calls.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does it send email?&lt;/strong&gt; Not by default. It saves drafts; you send them from your usual mail app.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which clients work?&lt;/strong&gt; Claude (web, desktop, mobile), ChatGPT on Business and Enterprise/Edu plans (Pro in read-only mode), Perplexity, and other MCP clients that support remote servers with OAuth.&lt;/p&gt;

&lt;p&gt;The full guide, kept up to date, is here: &lt;a href="https://app.fezola.com/en/guides/imap-mcp-server?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=imap-mcp-server" rel="noopener noreferrer"&gt;IMAP MCP server for Claude and ChatGPT&lt;/a&gt;. Questions about the MCP side (OAuth, annotations, keeping it read-mostly) are welcome in the comments.&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>ai</category>
      <category>email</category>
      <category>claude</category>
    </item>
  </channel>
</rss>
