DEV Community

Cover image for My agent wanted my Instagram password and that was the moment I knew the setup was wrong
Lars Winstand
Lars Winstand

Posted on • Originally published at standardcompute.com

My agent wanted my Instagram password and that was the moment I knew the setup was wrong

If your agent needs to touch Instagram, Linktree, Carrd, or an internal admin tool, do not give it passwords.

Give it connectors.

That sounds obvious when you say it out loud. But a lot of agent setups still quietly rely on browser logins, saved sessions, and "just let the model click through it" automation.

That works right up until it absolutely does not.

I was reading a thread on r/openclaw where someone asked a very normal question: can my agent get into apps through some kind of bridge instead of me doing everything manually?

One reply was blunt and correct:

Make.com is what I use. I just need it for simple stuff so I'm on the free tier.

Another pushed it further:

self-host n8n and add the mcp, skill, and api access and magic happens.

That is the mature answer.

Not: teach the agent to log into websites like a sleep-deprived intern.

Build a connector layer.

The smell test: if it needs a human login, the design is probably wrong

I get why teams do this.

You have Claude, GPT-5, OpenClaw, or a custom agent loop. You want it to:

  • publish an Instagram post
  • update a Linktree page
  • tweak a Carrd site
  • click through an internal admin panel

The fastest-looking path is:

  1. Open a browser
  2. Store a username/password
  3. Let the agent click buttons

For a demo, that can look magical.

For production, it's fragile in all the boring ways that matter:

  • MFA prompts
  • captchas
  • expired sessions
  • DOM changes
  • anti-bot checks
  • invisible rate limits
  • weird partial failures

And the security model is bad.

You are not giving the agent a scoped permission.

You are giving it a human identity.

That is a huge difference.

Instagram makes the problem obvious

Instagram is a good example because people assume it's simple.

"I just want the agent to post an image with a caption" sounds easy.

But Meta's official path is not "log in and click Post." If you want something stable, you need the actual API flow.

That means:

  • an Instagram professional account
  • OAuth
  • the right scopes
  • a two-step publish flow

The newer Instagram Login scopes include:

  • instagram_business_basic
  • instagram_business_content_publish
  • instagram_business_manage_messages
  • instagram_business_manage_comments

And Meta deprecated older scope values on January 27, 2025.

That alone should tell you this is not a good thing to bury inside a prompt and hope for the best.

The quota most browser bots ignore

Instagram also has a real publishing quota:

  • 50 published IG containers per 24 hours per account

Meta exposes it directly:

GET https://graph.facebook.com/<API_VERSION>/<IG_USER_ID>/content_publishing_limit?fields=quota_usage&access_token=<ACCESS_TOKEN>
Enter fullscreen mode Exit fullscreen mode

A proper connector can check quota before publishing.

A browser bot usually finds out after the fact and leaves you reading screenshots.

What the connector should do instead

Your agent should call something like this:

await tools.publish_instagram_post({
  imageUrl: "https://cdn.example.com/launch.png",
  caption: "Shipping today."
})
Enter fullscreen mode Exit fullscreen mode

And then your connector layer should do the ugly but necessary work:

  1. validate the media URL
  2. check quota usage
  3. create the media container
  4. publish the container
  5. return structured success or failure

The agent gets a tool.

The connector owns the mess.

Not every app deserves the same integration strategy

This is where teams get into trouble.

Apps do not expose the same kinds of interfaces.

Linktree is not Instagram

Linktree's public developer surface is centered around LinkApps.

You can scaffold one like this:

npx @linktr.ee/create-linkapp my-app
cd my-app
npm run dev
Enter fullscreen mode Exit fullscreen mode

Useful? Yes.

Equivalent to a broad public API for arbitrary profile editing? No.

Carrd is thinner still

Carrd has public help and product docs, but there is no obvious general-purpose public site editing API for agents to lean on.

That asymmetry matters.

Some apps have real APIs.
Some need workflow wrappers.
Some need custom internal endpoints.
Some edge cases still need browser automation.

But browser automation should be isolated behind a connector boundary, not made the agent's default operating mode.

The connector layer I would actually ship

This is the practical architecture.

Approach What it really means
Browser login automation Uses human credentials or session cookies; fragile around MFA, captchas, UI changes, and policy checks
Workflow connector layer with n8n or Make Uses OAuth, API keys, webhooks, retries, approvals, and logs; usually the best default
MCP server plus custom/internal APIs Gives the agent clean tools with narrow actions; best for internal systems and reusable integrations

If I expect the system to survive real usage, I pick the middle or bottom row almost every time.

Why n8n keeps showing up in serious agent stacks

n8n fits this pattern well because it is comfortable with mixed environments.

Real automation stacks are never clean. They usually look like this:

  • one official API
  • one internal REST endpoint
  • one webhook
  • one legacy system nobody wants to touch
  • one cursed browser fallback

n8n handles that patchwork better than most tools.

The HTTP Request node is the main escape hatch. You can wire it into an agent workflow and call almost any REST API.

For scale, n8n also documents queue mode with Redis-backed workers:

EXECUTIONS_MODE=queue
QUEUE_BULL_REDIS_HOST=<redis-host>
QUEUE_BULL_REDIS_PORT=6379
Enter fullscreen mode Exit fullscreen mode

And the operational constraints are explicit, which I appreciate because limits are where architecture gets real:

  • Postgres 13+
  • shared encryption keys across workers
  • queue mode for distributed execution
  • payload and timeout caps you should know before production

Examples:

N8N_PAYLOAD_SIZE_MAX=16
N8N_FORMDATA_FILE_SIZE_MAX=200
EXECUTIONS_TIMEOUT_MAX=3600
N8N_AI_TIMEOUT_MAX=3600000
Enter fullscreen mode Exit fullscreen mode

That stuff is not glamorous.

It is exactly the stuff that keeps your agent from falling over on a Tuesday night.

MCP is useful, but people keep assigning it the wrong job

MCP is an interface standard.

It is how an AI client talks to tools.

It is not the tool implementation itself.

That distinction matters a lot.

Good pattern

Agent -> MCP server -> n8n workflow or internal backend -> scoped API/OAuth/service account
Enter fullscreen mode Exit fullscreen mode

Bad pattern

Agent -> browser -> human login -> captcha -> incident
Enter fullscreen mode Exit fullscreen mode

If your agent calls publish_instagram_post, MCP can expose that method.

But something else still needs to implement it safely.

That implementation is your connector layer.

Internal tools are the easiest call: use service accounts

For internal systems, I don't think this is even debatable.

Use service identities, not employee credentials.

Your agent should not know Sarah from Ops' password.

It should know how to call a narrow action like:

{
  "tool": "create_customer_credit",
  "input": {
    "customer_id": "cus_123",
    "amount": 25,
    "reason": "duplicate charge"
  }
}
Enter fullscreen mode Exit fullscreen mode

Then your backend can enforce:

  • authorization
  • validation
  • audit logging
  • rate limiting
  • approvals if needed

That is what production-safe agent tooling looks like.

If browser automation is unavoidable, quarantine it

Sometimes there really is no API.

Fine.

Use Playwright or Puppeteer if you have to. But isolate it.

Put it behind:

  • a worker
  • a webhook
  • an MCP-exposed connector
  • a workflow boundary in n8n or Make

Treat it as a narrow, monitored, breakable component.

Do not make "browse random websites with employee credentials" a first-class primitive in your agent design.

That's not architecture.

That's pre-incident behavior.

A concrete pattern you can implement this week

If I were building this for a team using OpenClaw, Claude, GPT-5, or a custom agent framework, I would structure it like this:

  1. agent decides what action is needed
  2. MCP exposes a clean tool name
  3. n8n or Make runs the workflow
  4. API credentials, OAuth, or service accounts perform the real action
  5. browser automation exists only as a fallback

Example: Instagram publishing

// agent-side tool call
await tools.publish_instagram_post({
  imageUrl: "https://cdn.example.com/post.png",
  caption: "We just launched."
})
Enter fullscreen mode Exit fullscreen mode
// connector-side pseudo implementation
async function publishInstagramPost(input) {
  await assertPublicMediaUrl(input.imageUrl)

  const quota = await getPublishingQuota()
  if (quota.usage >= 50) {
    return { ok: false, error: "daily_quota_reached" }
  }

  const container = await createMediaContainer(input)
  const result = await publishContainer(container.id)

  return { ok: true, publishId: result.id }
}
Enter fullscreen mode Exit fullscreen mode

Example: internal admin action

await tools.create_status_update({
  incidentId: "inc_456",
  message: "Mitigation deployed, monitoring recovery"
})
Enter fullscreen mode Exit fullscreen mode
// backend uses service account credentials, not a human login
async function createStatusUpdate(input) {
  await requirePolicyCheck(input)
  return await statusApi.postUpdate(input)
}
Enter fullscreen mode Exit fullscreen mode

The agent sees verbs.

It does not see passwords.

Why this also matters for cost, not just reliability

This is the part people miss when they start running agents continuously.

Bad connector design doesn't just create incidents. It also creates waste.

Every flaky browser step turns into:

  • retries
  • longer runs
  • repeated planning loops
  • extra model calls
  • more monitoring overhead

That gets expensive fast when you're paying per token and your agent stack is constantly rethinking the same broken interaction.

This is one reason predictable compute matters for automation-heavy teams.

If you're running agents all day in n8n, Make, OpenClaw, or custom workflows, flat-rate API access is a much better fit than obsessing over every token every time a workflow loops.

Standard Compute is interesting here because it gives you an OpenAI-compatible API with unlimited usage at a flat monthly price, while routing across models like GPT-5.4, Claude Opus 4.6, and Grok 4.20 behind the scenes.

That does not fix bad architecture.

But once your architecture is connector-first instead of password-first, predictable pricing makes long-running automations much easier to operate.

Especially when the alternative is watching token spend spike because a browser bot got confused by a button label.

My opinionated takeaway

If your agent needs to touch Instagram, Linktree, Carrd, or internal tools, stop asking:

"Can it log in?"

Ask:

"What connector owns this action?"

My defaults:

  • Instagram: official API
  • internal tools: service accounts plus narrow APIs
  • orchestration: n8n or Make
  • agent/tool interface: MCP
  • no-API edge cases: isolated browser automation only

That setup is less flashy than giving an agent a browser and a password.

It is also the setup that survives contact with reality.

And once your agent stops pretending to be a human clicking around websites, it usually becomes more capable, not less.

Because now it can operate through systems designed to be automated instead of fighting systems designed to stop bots.

Top comments (0)