Openhandle
Read public Instagram, TikTok, X, and Reddit profiles, posts, comments, and metrics through MCP.
What it can do
- Find Test Data: Find stable synthetic inputs by platform, resource, operation, literal traits, expected status, error code, or text. This discovery call is unmetered.
- Get Test Data: Get one synthetic catalog entry by its stable catalog ID. This discovery call is unmetered.
- Instagram Comment Likers List: List comment likers from public Instagram data. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null mea
What data it sees
Do you need an account
No: the server works without sign-in
Read public Instagram, TikTok, X, and Reddit profiles, posts, comments, and metrics through MCP.
Connect agents with OAuth or an API key. Applications can also use the REST API. Choose live data or cached responses for creator analytics, influencer vetting, and social listening. Missing metrics remain null.
Pricing is prepaid and based on usage, with no subscription. Start with 100 real requests once, without a payment card, plus unlimited synthetic test requests. Live requests cost $0.0025 for the first 100,000 each month, then $0.002. Balance top-ups start at $10. Cached responses cost less; 30-day cache hits are free.
How to connect
How to connect Openhandle to Claude
The server address to paste into Claude settings:
https://openhandle--openhandle.run.tools
- Open Claude (claude.ai or the desktop app).
- Go to Settings → Connectors.
- Click Add custom connector.
- Paste the server address copied below into Remote MCP server URL and click Add.
- In a chat, click + → Connectors and switch the new connector on.
Custom connectors are available on Free, Pro, Max, Team and Enterprise plans (Free is limited to one). On Team and Enterprise an organization Owner adds the connector first under Organization settings → Connectors.
Authorization
After you click Add, a sign-in window for the service opens. Sign in with your own account and approve access. Claude never sees your password.
How to connect Openhandle to ChatGPT
The server address to paste into ChatGPT settings:
https://openhandle--openhandle.run.tools
- Open ChatGPT in a browser (chatgpt.com). A Plus, Pro, Business, Enterprise or Edu plan is required.
- Turn on developer mode once: Settings → Apps → Advanced settings → Developer mode.
- Open Settings → Connectors and click Create.
- Fill in the form: Name (anything), Description (one line about what the service does), MCP server URL (copy it below).
- Under Authentication choose OAuth if the service requires sign-in, otherwise None. Click Create.
- In a new chat open + → Apps/Connectors and enable the connector.
OpenAI has renamed this section before (Connectors → Apps/Plugins). If the label differs, search settings for "developer mode". On Business/Enterprise workspaces an admin must allow custom connectors first.
Authorization
On first use ChatGPT opens the service's sign-in window. Sign in and approve access.
How to connect Openhandle to Cursor
The server address to paste into Cursor settings:
https://openhandle--openhandle.run.tools
Fastest: click Open in Cursor below and confirm the prompt.
Manually:
- In Cursor open Settings → Cursor Settings → MCP and click Add new global MCP server.
- Paste the JSON copied below into
~/.cursor/mcp.json(per project:.cursor/mcp.jsonin the repo root). - Save the file. The server appears in the MCP list; authorize it there if asked.
Authorization
If the service needs sign-in, an authorize button appears next to the server in the MCP list.
Server tool list (60)
Raw names from tools/list. Only developers need these.
| find_test_data | Find stable synthetic inputs by platform, resource, operation, literal traits, expected status, error code, or text. This discovery call is unmetered. |
| get_test_data | Get one synthetic catalog entry by its stable catalog ID. This discovery call is unmetered. |
| instagram_comment_likers_list | List comment likers from public Instagram data. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=instagram.comment.likers.list for compatible synthetic input. |
| instagram_get_hashtag | Return one public hashtag by its native identifier. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=instagram.hashtag.get for compatible synthetic input. |
| instagram_get_location | Return one public location by its native identifier. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=instagram.location.get for compatible synthetic input. |
| instagram_get_music | Return one public music by its native identifier. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=instagram.music.get for compatible synthetic input. |
| instagram_get_post | Get a post by a canonical platform identifier. URLs must be converted before calling a data endpoint. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=instagram.post.get for compatible synthetic input. |
| instagram_get_profile | Return one public profile. Use @username or a platform ID as the identifier. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=instagram.profile.get for compatible synthetic input. |
| instagram_highlight_get | Get a highlight from public Instagram data. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=instagram.highlight.get for compatible synthetic input. |
| instagram_list_comment_replies | Return a stable page of replies for one comment. Use find_test_data to discover compatible post and comment IDs. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=instagram.comment.replies.list for compatible synthetic input. |
| instagram_list_followers | Return a cursor-paginated collection of Instagram profiles. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=instagram.profile.followers.list for compatible synthetic input. |
| instagram_list_following | Return a cursor-paginated collection of Instagram profiles. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=instagram.profile.following.list for compatible synthetic input. |
| instagram_list_hashtag_posts | Return a cursor-paginated collection of public posts. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=instagram.hashtag.posts.list for compatible synthetic input. |
| instagram_list_hashtag_reels | Return a cursor-paginated collection of Instagram reels for a hashtag. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=instagram.hashtag.reels.list for compatible synthetic input. |
| instagram_list_location_posts | Return a cursor-paginated collection of public posts. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=instagram.location.posts.list for compatible synthetic input. |
| instagram_list_post_comments | List post comments by a canonical platform identifier. URLs must be converted before calling a data endpoint. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=instagram.post.comments.list for compatible synthetic input. |
| instagram_list_post_likers | Return public profiles that liked an Instagram post. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=instagram.post.likers.list for compatible synthetic input. |
| instagram_list_post_tagged_users | Return public profiles tagged in an Instagram post. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=instagram.post.tagged.users.list for compatible synthetic input. |
| instagram_list_profile_pinned_posts | Return a cursor-paginated Instagram profile collection. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=instagram.profile.pinned.posts.list for compatible synthetic input. |
| instagram_list_profile_posts | Return a stable page of posts for one public profile. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=instagram.profile.posts.list for compatible synthetic input. |
| instagram_list_profile_reels | Return a cursor-paginated Instagram profile collection. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=instagram.profile.reels.list for compatible synthetic input. |
| instagram_list_profile_reposts | Return a cursor-paginated Instagram profile collection. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=instagram.profile.reposts.list for compatible synthetic input. |
| instagram_list_profile_tagged_posts | Return a cursor-paginated Instagram profile collection. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=instagram.profile.tagged.posts.list for compatible synthetic input. |
| instagram_list_profile_videos | Return a cursor-paginated Instagram profile collection. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=instagram.profile.videos.list for compatible synthetic input. |
| instagram_list_suggested | Return the current collection of Instagram profiles. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=instagram.profile.suggested.list for compatible synthetic input. |
| instagram_music_stream_list | List music stream pages from public Instagram data. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=instagram.music.stream.list for compatible synthetic input. |
| instagram_post_clip_metadata_get | Get clip metadata from public Instagram data. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=instagram.post.clip.metadata.get for compatible synthetic input. |
| instagram_post_comment_metadata_get | Get comment metadata from public Instagram data. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=instagram.post.comment.metadata.get for compatible synthetic input. |
| instagram_post_comment_moderation_get | Check comment moderation from public Instagram data. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=instagram.post.comment.moderation.get for compatible synthetic input. |
| instagram_post_insights_get | Get post insights from public Instagram data. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=instagram.post.insights.get for compatible synthetic input. |
| instagram_post_oembed_get | Get post oEmbed data from public Instagram data. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=instagram.post.oembed.get for compatible synthetic input. |
| instagram_post_template_get | Get post template from public Instagram data. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=instagram.post.template.get for compatible synthetic input. |
| instagram_profile_about_get | Get profile about information from public Instagram data. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=instagram.profile.about.get for compatible synthetic input. |
| instagram_profile_business_recommendations_list | List business recommendations from public Instagram data. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=instagram.profile.business.recommendations.list for compatible synthetic input. |
| instagram_profile_highlights_list | List profile highlights from public Instagram data. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=instagram.profile.highlights.list for compatible synthetic input. |
| instagram_profile_stories_list | List profile stories from public Instagram data. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=instagram.profile.stories.list for compatible synthetic input. |
| instagram_search_hashtags | Search public Instagram hashtags with cursor pagination. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=instagram.search.hashtags.list for compatible synthetic input. |
| instagram_search_music | Search public Instagram music with cursor pagination. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=instagram.search.music.list for compatible synthetic input. |
| instagram_search_places | Search public Instagram places with cursor pagination. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=instagram.search.places.list for compatible synthetic input. |
| instagram_search_profile_followers | Search within a public profile's followers collection. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=instagram.profile.followers.search for compatible synthetic input. |
| instagram_search_profile_following | Search within a public profile's following collection. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=instagram.profile.following.search for compatible synthetic input. |
| instagram_search_profiles | Search public Instagram profiles with cursor pagination. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=instagram.search.profiles.list for compatible synthetic input. |
| instagram_search_reels | Search public Instagram reels with cursor pagination. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=instagram.search.reels.list for compatible synthetic input. |
| instagram_search_top_list | Search all Instagram results from public Instagram data. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=instagram.search.top.list for compatible synthetic input. |
| instagram_story_get | Get a story from public Instagram data. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=instagram.story.get for compatible synthetic input. |
| reddit_domain_posts_list | List domain posts from public Reddit data. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=reddit.domain.posts.list for compatible synthetic input. |
| reddit_post_comments_list | List post comments from public Reddit data. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=reddit.post.comments.list for compatible synthetic input. |
| reddit_post_duplicates_list | List duplicate posts from public Reddit data. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=reddit.post.duplicates.list for compatible synthetic input. |
| reddit_post_get | Get a post from public Reddit data. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=reddit.post.get for compatible synthetic input. |
| reddit_profile_comments_list | List profile comments from public Reddit data. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=reddit.profile.comments.list for compatible synthetic input. |
| reddit_profile_get | Return one public Reddit profile. Use @username or a t2_ profile ID. An ID resolves only after the profile was read by username once. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=reddit.profile.get for compatible synthetic input. |
| reddit_profile_moderated_list | List moderated subreddits from public Reddit data. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=reddit.profile.moderated.list for compatible synthetic input. |
| reddit_profile_posts_list | List profile posts from public Reddit data. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=reddit.profile.posts.list for compatible synthetic input. |
| reddit_profile_trophies_list | List profile trophies from public Reddit data. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=reddit.profile.trophies.list for compatible synthetic input. |
| reddit_search_posts_list | Search posts from public Reddit data. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=reddit.search.posts.list for compatible synthetic input. |
| reddit_search_profiles_list | Search profiles from public Reddit data. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=reddit.search.profiles.list for compatible synthetic input. |
| reddit_search_subreddits_list | Search subreddits from public Reddit data. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=reddit.search.subreddits.list for compatible synthetic input. |
| reddit_subreddit_get | Get a subreddit from public Reddit data. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=reddit.subreddit.get for compatible synthetic input. |
| reddit_subreddit_posts_list | List subreddit posts from public Reddit data. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=reddit.subreddit.posts.list for compatible synthetic input. |
| reddit_subreddit_rules_list | List subreddit rules from public Reddit data. The API key selects Test or Live. Test calls record a $0.000 actual charge and return the live-equivalent price. null means unavailable, not zero. Use find_test_data with operation=reddit.subreddit.rules.list for compatible synthetic input. |