universal-mcp-applications 0.1.18__py3-none-any.whl → 0.1.20__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of universal-mcp-applications might be problematic. Click here for more details.

Files changed (79) hide show
  1. universal_mcp/applications/ahrefs/README.md +3 -3
  2. universal_mcp/applications/airtable/README.md +3 -3
  3. universal_mcp/applications/asana/README.md +3 -3
  4. universal_mcp/applications/aws_s3/README.md +29 -0
  5. universal_mcp/applications/bill/README.md +249 -0
  6. universal_mcp/applications/calendly/README.md +45 -45
  7. universal_mcp/applications/canva/README.md +35 -35
  8. universal_mcp/applications/clickup/README.md +4 -4
  9. universal_mcp/applications/contentful/README.md +1 -2
  10. universal_mcp/applications/crustdata/README.md +3 -3
  11. universal_mcp/applications/domain_checker/README.md +2 -2
  12. universal_mcp/applications/e2b/README.md +4 -4
  13. universal_mcp/applications/elevenlabs/README.md +3 -77
  14. universal_mcp/applications/exa/README.md +7 -7
  15. universal_mcp/applications/falai/README.md +13 -12
  16. universal_mcp/applications/figma/README.md +3 -3
  17. universal_mcp/applications/file_system/README.md +13 -0
  18. universal_mcp/applications/firecrawl/README.md +9 -9
  19. universal_mcp/applications/fireflies/README.md +14 -14
  20. universal_mcp/applications/fireflies/app.py +109 -1
  21. universal_mcp/applications/fpl/README.md +12 -12
  22. universal_mcp/applications/fpl/app.py +5 -5
  23. universal_mcp/applications/github/README.md +10 -10
  24. universal_mcp/applications/google_calendar/README.md +10 -10
  25. universal_mcp/applications/google_docs/README.md +14 -14
  26. universal_mcp/applications/google_drive/README.md +54 -57
  27. universal_mcp/applications/google_drive/app.py +22 -10
  28. universal_mcp/applications/google_gemini/README.md +3 -14
  29. universal_mcp/applications/google_mail/README.md +20 -20
  30. universal_mcp/applications/google_searchconsole/README.md +10 -10
  31. universal_mcp/applications/google_sheet/README.md +25 -25
  32. universal_mcp/applications/google_sheet/app.py +131 -131
  33. universal_mcp/applications/http_tools/README.md +5 -5
  34. universal_mcp/applications/hubspot/__init__.py +1 -1
  35. universal_mcp/applications/hubspot/api_segments/__init__.py +0 -0
  36. universal_mcp/applications/hubspot/api_segments/api_segment_base.py +25 -0
  37. universal_mcp/applications/hubspot/api_segments/crm_api.py +7337 -0
  38. universal_mcp/applications/hubspot/api_segments/marketing_api.py +1467 -0
  39. universal_mcp/applications/hubspot/app.py +74 -146
  40. universal_mcp/applications/klaviyo/README.md +0 -36
  41. universal_mcp/applications/linkedin/README.md +4 -4
  42. universal_mcp/applications/mailchimp/README.md +3 -3
  43. universal_mcp/applications/ms_teams/README.md +31 -31
  44. universal_mcp/applications/neon/README.md +3 -3
  45. universal_mcp/applications/openai/README.md +18 -17
  46. universal_mcp/applications/outlook/README.md +9 -9
  47. universal_mcp/applications/perplexity/README.md +4 -4
  48. universal_mcp/applications/posthog/README.md +128 -127
  49. universal_mcp/applications/reddit/README.md +21 -124
  50. universal_mcp/applications/resend/README.md +29 -29
  51. universal_mcp/applications/scraper/README.md +4 -4
  52. universal_mcp/applications/semrush/README.md +3 -0
  53. universal_mcp/applications/serpapi/README.md +3 -3
  54. universal_mcp/applications/sharepoint/README.md +17 -0
  55. universal_mcp/applications/shortcut/README.md +3 -3
  56. universal_mcp/applications/slack/README.md +23 -0
  57. universal_mcp/applications/spotify/README.md +3 -3
  58. universal_mcp/applications/supabase/README.md +3 -3
  59. universal_mcp/applications/tavily/README.md +4 -4
  60. universal_mcp/applications/twilio/README.md +15 -0
  61. universal_mcp/applications/twitter/README.md +92 -89
  62. universal_mcp/applications/twitter/app.py +11 -11
  63. universal_mcp/applications/unipile/README.md +17 -17
  64. universal_mcp/applications/whatsapp/README.md +12 -12
  65. universal_mcp/applications/whatsapp/app.py +13 -13
  66. universal_mcp/applications/whatsapp_business/README.md +23 -23
  67. universal_mcp/applications/yahoo_finance/README.md +17 -0
  68. universal_mcp/applications/yahoo_finance/__init__.py +1 -0
  69. universal_mcp/applications/yahoo_finance/app.py +258 -0
  70. universal_mcp/applications/youtube/README.md +46 -46
  71. universal_mcp/applications/youtube/app.py +7 -1
  72. universal_mcp/applications/zenquotes/README.md +1 -1
  73. {universal_mcp_applications-0.1.18.dist-info → universal_mcp_applications-0.1.20.dist-info}/METADATA +3 -89
  74. {universal_mcp_applications-0.1.18.dist-info → universal_mcp_applications-0.1.20.dist-info}/RECORD +76 -71
  75. universal_mcp/applications/replicate/README.md +0 -18
  76. universal_mcp/applications/replicate/__init__.py +0 -1
  77. universal_mcp/applications/replicate/app.py +0 -493
  78. {universal_mcp_applications-0.1.18.dist-info → universal_mcp_applications-0.1.20.dist-info}/WHEEL +0 -0
  79. {universal_mcp_applications-0.1.18.dist-info → universal_mcp_applications-0.1.20.dist-info}/licenses/LICENSE +0 -0
@@ -1,17 +1,17 @@
1
1
  from universal_mcp.applications.application import APIApplication
2
2
  from universal_mcp.integrations import Integration
3
3
 
4
- from .api_segments.compliance_api import ComplianceApi
5
- from .api_segments.dm_conversations_api import DmConversationsApi
6
- from .api_segments.dm_events_api import DmEventsApi
7
- from .api_segments.likes_api import LikesApi
8
- from .api_segments.lists_api import ListsApi
9
- from .api_segments.openapi_json_api import OpenapiJsonApi
10
- from .api_segments.spaces_api import SpacesApi
11
- from .api_segments.trends_api import TrendsApi
12
- from .api_segments.tweets_api import TweetsApi
13
- from .api_segments.usage_api import UsageApi
14
- from .api_segments.users_api import UsersApi
4
+ from universal_mcp.applications.twitter.api_segments.compliance_api import ComplianceApi
5
+ from universal_mcp.applications.twitter.api_segments.dm_conversations_api import DmConversationsApi
6
+ from universal_mcp.applications.twitter.api_segments.dm_events_api import DmEventsApi
7
+ from universal_mcp.applications.twitter.api_segments.likes_api import LikesApi
8
+ from universal_mcp.applications.twitter.api_segments.lists_api import ListsApi
9
+ from universal_mcp.applications.twitter.api_segments.openapi_json_api import OpenapiJsonApi
10
+ from universal_mcp.applications.twitter.api_segments.spaces_api import SpacesApi
11
+ from universal_mcp.applications.twitter.api_segments.trends_api import TrendsApi
12
+ from universal_mcp.applications.twitter.api_segments.tweets_api import TweetsApi
13
+ from universal_mcp.applications.twitter.api_segments.usage_api import UsageApi
14
+ from universal_mcp.applications.twitter.api_segments.users_api import UsersApi
15
15
 
16
16
 
17
17
  class TwitterApp(APIApplication):
@@ -9,20 +9,20 @@ This is automatically generated from OpenAPI schema for the UnipileApp API.
9
9
 
10
10
  | Tool | Description |
11
11
  |------|-------------|
12
- | `list_all_chats` | Lists all chats, with options to filter by unread status, pagination, date ranges, and account. |
13
- | `list_chat_messages` | Lists all messages from a specific chat, with pagination and filtering options. |
14
- | `send_chat_message` | Sends a message in a specific chat. |
15
- | `retrieve_chat` | Retrieves a specific chat by its Unipile or provider ID. |
16
- | `list_all_messages` | Lists all messages across all chats, with pagination and filtering options. |
17
- | `list_all_accounts` | Lists all linked accounts. |
18
- | `retrieve_account` | Retrieves a specific linked account by its ID. |
19
- | `list_user_posts` | Lists all posts for a given user or company identifier. |
20
- | `retrieve_own_profile` | Retrieves the profile of the user associated with the given Unipile account_id. |
21
- | `retrieve_profile` | Retrieves a specific user profile by its identifier. |
22
- | `retrieve_post` | Retrieves a specific post by its ID. |
23
- | `list_post_comments` | Lists all comments from a specific post. Can also list replies to a specific comment. |
24
- | `create_post` | Creates a new post on LinkedIn. |
25
- | `list_post_reactions` | Lists all reactions from a specific post or comment. |
26
- | `create_post_comment` | Adds a comment to a specific post. |
27
- | `add_reaction_to_post` | Adds a reaction to a post or comment. |
28
- | `search` | Performs a comprehensive search on LinkedIn for people, companies, posts, or jobs. |
12
+ | `list_all_chats` | Retrieves a paginated list of all chat conversations across linked accounts. Supports filtering by unread status, date range, account provider, and specific account IDs, distinguishing it from functions listing messages within a single chat. |
13
+ | `list_chat_messages` | Retrieves messages from a specific chat identified by `chat_id`. Supports pagination and filtering by date or sender. Unlike `list_all_messages`, which fetches from all chats, this function targets the contents of a single conversation. |
14
+ | `send_chat_message` | Sends a text message to a specific chat conversation using its `chat_id`. This function creates a new message via a POST request, distinguishing it from read-only functions like `list_chat_messages`. It returns the API's response, which typically confirms the successful creation of the message. |
15
+ | `retrieve_chat` | Retrieves a single chat's details using its Unipile or provider-specific ID. Requires an `account_id` when using a provider ID for context. This function is distinct from `list_all_chats`, which returns a collection, by targeting one specific conversation. |
16
+ | `list_all_messages` | Retrieves a paginated list of messages from all chats associated with the account(s). Unlike `list_chat_messages` which targets a specific conversation, this function provides a global message view, filterable by sender, account, and date range. |
17
+ | `list_all_accounts` | Retrieves a paginated list of all social media accounts linked to the Unipile service. This is crucial for obtaining the `account_id` required by other methods to specify which user account should perform an action, like sending a message or retrieving user-specific posts. |
18
+ | `retrieve_linked_account` | Retrieves details for a specific account linked to Unipile using its ID. It fetches metadata about the connection itself (e.g., a linked LinkedIn account), differentiating it from `retrieve_user_profile` which fetches a user's profile from the external platform. |
19
+ | `list_profile_posts` | Retrieves a paginated list of posts from a specific user or company profile using their provider ID. An authorizing `account_id` is required, and the `is_company` flag must specify the entity type, distinguishing this from `retrieve_post` which fetches a single post by its own ID. |
20
+ | `retrieve_own_profile` | Retrieves the profile details for the user associated with the specified Unipile account ID. This function targets the API's 'me' endpoint to fetch the authenticated user's profile, distinct from `retrieve_user_profile` which fetches profiles of other users by their public identifier. |
21
+ | `retrieve_user_profile` | Retrieves a specific LinkedIn user's profile using their public or internal ID, authorized via the provided `account_id`. Unlike `retrieve_own_profile`, which fetches the authenticated user's details, this function targets and returns data for any specified third-party user profile on the platform. |
22
+ | `retrieve_post` | Fetches a specific post's details by its unique ID, requiring an `account_id` for authorization. Unlike `list_profile_posts`, which retrieves a collection of posts from a user or company profile, this function targets one specific post and returns its full object. |
23
+ | `list_post_comments` | Fetches comments for a specific post using an `account_id` for authorization. Providing an optional `comment_id` retrieves threaded replies instead of top-level comments. This read-only operation contrasts with `create_post_comment`, which publishes new comments, and `list_content_reactions`, which retrieves 'likes'. |
24
+ | `create_post` | Publishes a new top-level post from a specified account, including text, user mentions, and an external link. This function creates original content, distinguishing it from `create_post_comment` which adds replies to existing posts. |
25
+ | `list_content_reactions` | Retrieves a paginated list of reactions for a given post or, optionally, a specific comment. This read-only operation uses the provided `account_id` for the request, distinguishing it from the `create_reaction` function which adds new reactions. |
26
+ | `create_post_comment` | Publishes a comment on a specified post. By providing an optional `comment_id`, it creates a threaded reply to an existing comment instead of a new top-level one. This function's dual capability distinguishes it from `list_post_comments`, which only retrieves comments and their replies. |
27
+ | `create_reaction` | Adds a specified reaction (e.g., 'like', 'love') to a LinkedIn post or, optionally, to a specific comment. This function performs a POST request to create the reaction, differentiating it from `list_content_reactions` which only retrieves existing ones. |
28
+ | `search` | Performs a comprehensive LinkedIn search for people, companies, posts, or jobs using granular filters like keywords and location. Alternatively, it can execute a search from a direct LinkedIn URL. Supports pagination and targets either the classic or Sales Navigator API. |
@@ -9,15 +9,15 @@ This is automatically generated from OpenAPI schema for the WhatsappApp API.
9
9
 
10
10
  | Tool | Description |
11
11
  |------|-------------|
12
- | `search_contacts` | Search WhatsApp contacts by name or phone number. |
13
- | `list_messages` | Get WhatsApp messages matching specified criteria with optional context. |
14
- | `list_chats` | Get WhatsApp chats matching specified criteria. |
15
- | `get_chat` | Get WhatsApp chat metadata by JID. |
16
- | `get_direct_chat_by_contact` | Get WhatsApp chat metadata by sender phone number. |
17
- | `get_contact_chats` | Get all WhatsApp chats involving the contact. |
18
- | `get_last_interaction` | Get most recent WhatsApp message involving the contact. |
19
- | `get_message_context` | Get context around a specific WhatsApp message. |
20
- | `send_message` | Send a WhatsApp message to a person or group. For group chats use the JID. |
21
- | `send_file` | Send a file such as a picture, raw audio, video or document via WhatsApp to the specified recipient. For group messages use the JID. |
22
- | `send_audio_message` | Send any audio file as a WhatsApp audio message to the specified recipient. For group messages use the JID. If it errors due to ffmpeg not being installed, use send_file instead. |
23
- | `download_media` | Download media from a WhatsApp message and get the local file path. |
12
+ | `search_contacts` | Searches for WhatsApp contacts by name or phone number. This function takes a query string, handles user authentication, and calls the underlying API to find and return a list of matching contacts. It serves as the primary method to look up contact information within the application. |
13
+ | `search_messages` | Searches for and retrieves a paginated list of WhatsApp messages using various filters like date, sender, chat, or content query. It can optionally include surrounding contextual messages for each result, unlike `get_message_context` which targets a single message ID. |
14
+ | `search_chats` | Retrieves a paginated list of WhatsApp chats, allowing filtering by a search query and sorting by activity or name. Unlike `get_chat`, which fetches a single known chat, this function provides broad search and discovery capabilities across multiple user conversations. |
15
+ | `get_chat_by_jid` | Retrieves metadata for a specific WhatsApp chat (direct or group) using its unique JID. It can optionally include the most recent message. This precise JID-based lookup distinguishes it from `get_direct_chat_by_contact`, which uses a phone number, and `list_chats`, which performs a broader search. |
16
+ | `get_direct_chat_by_phone_number` | Retrieves metadata for a direct (one-on-one) WhatsApp chat using a contact's phone number. Unlike `get_chat` which requires a JID, this provides a simpler way to find direct conversations. Returns a dictionary containing the chat's details, such as its JID and name. |
17
+ | `list_chats_by_contact_jid` | Retrieves a paginated list of all WhatsApp chats, including direct messages and groups, that a specific contact participates in. The contact is identified by their unique JID. This differs from `get_direct_chat_by_contact` which only finds one-on-one chats. |
18
+ | `get_last_message_by_jid` | Retrieves the content of the most recent message involving a specific contact, identified by their JID. It authenticates the user and returns the message directly as a string, offering a quick way to view the last communication without fetching full message objects or chat histories. |
19
+ | `get_message_context` | Fetches the conversational context surrounding a specific WhatsApp message ID. It retrieves a configurable number of messages immediately preceding and following the target message. This provides a focused view of a dialogue, unlike `list_messages` which performs broader, filter-based searches. |
20
+ | `send_text_message` | Authenticates the user and sends a text message to a specified WhatsApp recipient. The recipient can be an individual (via phone number) or a group (via JID). It returns a dictionary indicating the operation's success status and a corresponding message. |
21
+ | `send_attachment` | Sends a media file (image, video, document, raw audio) as a standard attachment to a WhatsApp contact or group using their phone number or JID. Unlike `send_audio_message`, which creates a playable voice note, this function handles general file transfers. Returns a success status dictionary. |
22
+ | `send_voice_message` | Sends a local audio file as a playable WhatsApp voice message, converting it to the required format. Unlike `send_file` which sends audio as a document attachment, this function formats the audio as a voice note. It can be sent to an individual contact or a group chat. |
23
+ | `download_media_from_message` | Downloads media from a specific WhatsApp message, identified by its ID and chat JID. It saves the content to a local file and returns the file's path upon success. The function automatically handles user authentication before initiating the download. |
@@ -1,43 +1,43 @@
1
1
  from typing import Any
2
2
 
3
3
  import requests
4
- from .whatsapp import (
4
+ from universal_mcp.applications.whatsapp.whatsapp import (
5
5
  WHATSAPP_API_BASE_URL,
6
6
  )
7
- from .whatsapp import (
7
+ from universal_mcp.applications.whatsapp.whatsapp import (
8
8
  download_media as whatsapp_download_media,
9
9
  )
10
- from .whatsapp import (
10
+ from universal_mcp.applications.whatsapp.whatsapp import (
11
11
  get_chat as whatsapp_get_chat,
12
12
  )
13
- from .whatsapp import (
13
+ from universal_mcp.applications.whatsapp.whatsapp import (
14
14
  get_contact_chats as whatsapp_get_contact_chats,
15
15
  )
16
- from .whatsapp import (
16
+ from universal_mcp.applications.whatsapp.whatsapp import (
17
17
  get_direct_chat_by_contact as whatsapp_get_direct_chat_by_contact,
18
18
  )
19
- from .whatsapp import (
19
+ from universal_mcp.applications.whatsapp.whatsapp import (
20
20
  get_last_interaction as whatsapp_get_last_interaction,
21
21
  )
22
- from .whatsapp import (
22
+ from universal_mcp.applications.whatsapp.whatsapp import (
23
23
  get_message_context as whatsapp_get_message_context,
24
24
  )
25
- from .whatsapp import (
25
+ from universal_mcp.applications.whatsapp.whatsapp import (
26
26
  list_chats as whatsapp_list_chats,
27
27
  )
28
- from .whatsapp import (
28
+ from universal_mcp.applications.whatsapp.whatsapp import (
29
29
  list_messages as whatsapp_list_messages,
30
30
  )
31
- from .whatsapp import (
31
+ from universal_mcp.applications.whatsapp.whatsapp import (
32
32
  search_contacts as whatsapp_search_contacts,
33
33
  )
34
- from .whatsapp import (
34
+ from universal_mcp.applications.whatsapp.whatsapp import (
35
35
  send_audio_message as whatsapp_audio_voice_message,
36
36
  )
37
- from .whatsapp import (
37
+ from universal_mcp.applications.whatsapp.whatsapp import (
38
38
  send_file as whatsapp_send_file,
39
39
  )
40
- from .whatsapp import (
40
+ from universal_mcp.applications.whatsapp.whatsapp import (
41
41
  send_message as whatsapp_send_message,
42
42
  )
43
43
 
@@ -9,26 +9,26 @@ This is automatically generated from OpenAPI schema for the WhatsappBusinessApp
9
9
 
10
10
  | Tool | Description |
11
11
  |------|-------------|
12
- | `get_analytics` | Retrieves details of a specified WhatsApp Business Account (WABA) with customizable fields using the GET method. |
13
- | `get_credit_lines` | Retrieves the extended credit lines available for a specified business account using its ID. |
14
- | `get_business_account` | Retrieves information about a business account using the specified API version and business account ID, optionally filtering the response fields via a query parameter. |
15
- | `get_commerce_settings` | Retrieves the commerce settings configured for a specific WhatsApp Business phone number. |
16
- | `set_or_update_commerce_settings` | Updates WhatsApp Business commerce settings (cart availability and catalog visibility) for a specific business phone number. |
17
- | `upload_file` | Uploads a file using the specified API version and application ID, with optional query parameters for file length and type, and returns a successful status message upon completion. |
18
- | `resume_session` | Initiates a session using the provided SESSION_ID and file offset specified in the header, supporting further session-related operations via the POST method at the "/{api-version}/<SESSION_ID>" endpoint. |
19
- | `get_business_phone_number` | Retrieves details for a specific business phone number ID using query parameters to specify returned fields. |
20
- | `get_all_business_phone_numbers` | Retrieves a list of phone numbers associated with a specific WhatsApp Business Account (WABA), allowing for filtering and customization of the response fields. |
21
- | `get_qr_code` | Retrieves a message linked to a specific QR code for a business phone number using the GET method via the API. |
22
- | `delete_qr_code` | Deletes a specific WhatsApp Business QR code using the provided QR code ID and returns a success message if the operation is completed successfully. |
23
- | `get_all_qr_codes_default_fields` | Retrieves a list of message QR code deep links associated with a business phone number, filtered by specified fields and QR code identifiers. |
24
- | `create_qr_code` | Creates a WhatsApp Business QR code with a predefined message and returns the generated code details. |
25
- | `get_template_by_id_default_fields` | Retrieves a template using the specified template ID from the API version path. |
26
- | `edit_template` | Creates or processes a resource using the specified template ID based on the API version and returns a successful status upon completion. |
27
- | `get_template_by_name_default_fields` | Retrieves a list of WhatsApp message templates associated with a specific WhatsApp Business Account using the "GET" method, allowing filtering by template name. |
28
- | `create_message_template` | Creates a new WhatsApp message template for a business account, allowing businesses to send standardized messages to customers. |
29
- | `delete_template_by_name` | Deletes WhatsApp message templates by name (all languages) or specific ID using query parameters and returns a success status. |
30
- | `get_subscribed_apps` | Retrieves a list of apps subscribed to webhooks for a WhatsApp Business Account using the GET method. |
31
- | `subscribe_app_to_waba_swebhooks` | Subscribes an app to webhooks for a WhatsApp Business Account (WABA) using the POST method at the `/subscribed_apps` endpoint, allowing the app to receive updates and notifications from the WABA. |
32
- | `unsubscribe_apps_by_waba_id` | Unsubscribes an app from webhook notifications for a WhatsApp Business Account. |
33
- | `get_all_shared_wabas` | Retrieves information about WhatsApp Business accounts associated with a business client, using the specified business account ID and API version. |
34
- | `get_all_owned_wabas` | Retrieves a list of WhatsApp Business Accounts owned by or shared with the specified business account using a GET request to the given endpoint. |
12
+ | `get_whatsapp_business_account` | Fetches customizable data, primarily analytics, for a specific WhatsApp Business Account (WABA) using its ID. The `fields` parameter allows detailed queries, including date ranges and granularity for metrics like message volume, to refine the returned data. |
13
+ | `get_business_account_credit_lines` | Retrieves the extended credit lines for a specified business account ID. This function fetches billing information by querying the `/extendedcredits` endpoint, returning financial details such as available credit for platform services. |
14
+ | `get_business_account` | Fetches details for a specific Meta Business Account using its ID. This function retrieves the core account object, unlike others that get associated resources like owned/shared WhatsApp Business Accounts (WABAs) or credit lines for the same ID. The response payload can be customized using the 'fields' parameter. |
15
+ | `get_commerce_settings` | Retrieves the commerce settings, such as cart availability and catalog visibility, for a specific WhatsApp Business phone number. This function reads the current configuration, contrasting with `set_or_update_commerce_settings` which modifies them. |
16
+ | `update_commerce_settings` | Updates the commerce settings for a specific business phone number by enabling or disabling cart functionality and catalog visibility. This function differentiates from `get_commerce_settings` by using a POST request to modify data, rather than retrieving it. |
17
+ | `create_upload_session` | Initiates a resumable upload session by providing file metadata (size, type). This function creates an upload session ID and is the first of a two-step process for uploading media, preceding the actual data transfer performed by `resume_session`. |
18
+ | `upload_file_to_session` | Continues a media file upload by sending file data to an existing session. This function is the second step in the upload process, following `upload_file`, which creates the session and provides the required session ID. |
19
+ | `get_business_phone_number` | Retrieves details for a specific WhatsApp Business phone number by its unique ID. The optional `fields` parameter allows for customizing the response to include only desired data, differentiating it from `get_all_business_phone_numbers`, which retrieves a list of all numbers for a WABA. |
20
+ | `list_waba_phone_numbers` | Fetches a list of phone numbers for a specified WhatsApp Business Account (WABA). This function allows for result filtering and customizable field selection, distinguishing it from `get_business_phone_number` which retrieves a single number by its unique ID. |
21
+ | `get_qr_code_by_id` | Retrieves the details of a single QR code, such as its pre-filled message, by its unique ID for a specific business phone number. It fetches a specific code, distinguishing it from `get_all_qr_codes_default_fields` which retrieves a list of codes. |
22
+ | `delete_qr_code_by_id` | Deletes a specific WhatsApp message QR code by its ID for a given business phone number. The function sends a DELETE request to the Graph API's `message_qrdls` endpoint to remove the specified QR code. |
23
+ | `list_qr_codes` | Retrieves a list of QR codes for a business phone number. This function allows optional filtering by a specific QR code identifier and customization of the fields returned in the response, such as the image format. |
24
+ | `create_qr_code` | Generates a WhatsApp Business QR code for a specific phone number. This function allows setting a prefilled message for user convenience and can optionally include a custom identifier. It returns the details of the newly created QR code upon successful generation. |
25
+ | `get_template_by_id` | Retrieves a specific WhatsApp message template by its unique identifier. Unlike `get_template_by_name`, which searches within a business account, this function directly fetches a single template resource. Note: The function signature is missing the required `template_id` parameter to build a valid URL. |
26
+ | `update_template_by_id` | Updates an existing WhatsApp message template, identified by its ID within the request URL. This function modifies the template's category, components, language, and name by submitting new data via a POST request, returning the API response upon successful completion. |
27
+ | `get_message_templates` | Retrieves message templates for a specific WhatsApp Business Account (WABA). It can list all templates or, if a name is provided, filter for an exact match. This differs from `get_template_by_id_default_fields`, which fetches a single template by its unique ID. |
28
+ | `create_message_template` | Creates a new message template for a specified WhatsApp Business Account (WABA). This function sends a POST request with the template's name, language, category, and structural components, enabling the creation of standardized, reusable messages. |
29
+ | `delete_message_template` | Deletes a message template from a WhatsApp Business Account. Templates can be targeted for deletion by providing either a template name, which deletes all language versions, or a specific template ID (`hsm_id`). |
30
+ | `get_subscribed_apps` | Retrieves a list of all applications subscribed to receive webhook notifications for a given WhatsApp Business Account (WABA). This function provides a read-only view of current webhook subscriptions, complementing the functions for subscribing and unsubscribing apps. |
31
+ | `subscribe_app_to_webhooks` | Subscribes an application to a specific WhatsApp Business Account's (WABA) webhooks using its ID. This enables the app to receive real-time event notifications, differentiating it from functions that list or remove subscriptions. |
32
+ | `unsubscribe_app_from_waba` | Removes the webhook subscription for the calling app from a specified WhatsApp Business Account (WABA), stopping it from receiving notifications. This function complements `get_subscribed_apps` and `subscribe_app_to_waba_swebhooks` by handling the deletion of a subscription. |
33
+ | `get_all_client_wabas` | Retrieves all client WhatsApp Business Accounts (WABAs) associated with a specific business account ID. It's used by Solution Partners to list WABAs they manage for other businesses, distinguishing them from accounts they directly own (`get_all_owned_wabas`). |
34
+ | `get_all_owned_wabas` | Retrieves a list of all WhatsApp Business Accounts (WABAs) directly owned by a specified business account. This is distinct from `get_all_shared_wabas`, which fetches WABAs shared with clients, providing specific access to owned assets instead of associated ones. |
@@ -0,0 +1,17 @@
1
+ # YahooFinanceApp MCP Server
2
+
3
+ An MCP Server for Yahoo Finance data using the yfinance library.
4
+
5
+ ## 🛠️ Tool List
6
+
7
+ This provides access to Yahoo Finance data including stock information, historical prices, news, and financial statements.
8
+
9
+ | Tool | Description |
10
+ |------|-------------|
11
+ | `get_stock_info` | Gets real-time stock information including current price, market cap, financial ratios, and company details. Returns the complete raw data from Yahoo Finance for maximum flexibility. |
12
+ | `get_stock_history` | Gets historical price data for a stock with OHLCV data, dividends, and stock splits. Returns complete DataFrame with all available historical data. |
13
+ | `get_stock_news` | Gets latest news articles for a stock from Yahoo Finance. Returns raw list of news articles. |
14
+ | `get_financial_statements` | Gets financial statements for a stock from Yahoo Finance. Returns dictionary with financial statement data for income, balance, cashflow, or earnings statements. |
15
+ | `get_stock_recommendations` | Gets analyst recommendations for a stock from Yahoo Finance. Returns list of dictionaries with analyst recommendation data or upgrades/downgrades. |
16
+ | `search` | Search Yahoo Finance for quotes, news, and research using yfinance Search. Returns dictionary containing all available search data. |
17
+ | `lookup_ticker` | Look up ticker symbols by type using yfinance Lookup. Returns list of dictionaries with ticker lookup results filtered by security type (stock, etf, mutualfund, etc). |
@@ -0,0 +1 @@
1
+ from .app import YahooFinanceApp
@@ -0,0 +1,258 @@
1
+ import yfinance as yf
2
+ from typing import Any
3
+ from universal_mcp.applications.application import APIApplication
4
+ from universal_mcp.integrations import Integration
5
+
6
+
7
+ class YahooFinanceApp(APIApplication):
8
+ """
9
+ Application for interacting with Yahoo Finance data using yfinance library.
10
+ Provides tools to retrieve stock information, historical data, news, and financial statements.
11
+ """
12
+
13
+ def __init__(self, integration: Integration | None = None, **kwargs) -> None:
14
+ super().__init__(name="yahoo_finance", integration=integration, **kwargs)
15
+
16
+ def get_stock_info(self, symbol: str) -> dict[str, Any]:
17
+ """
18
+ Gets real-time stock information including current price, market cap, financial ratios, and company details.
19
+
20
+ Args:
21
+ symbol: Stock ticker symbol (e.g., 'AAPL', 'GOOGL', 'MSFT')
22
+
23
+ Returns:
24
+ Complete dictionary with all available stock data fields from Yahoo Finance
25
+
26
+ Raises:
27
+ ValueError: Invalid or empty symbol
28
+ KeyError: Stock symbol not found
29
+ ConnectionError: Network or API issues
30
+
31
+ Tags:
32
+ stock, info, real-time, price, financials, company-data, important
33
+ """
34
+ if not symbol:
35
+ raise ValueError("Stock symbol cannot be empty")
36
+
37
+ symbol = symbol.upper().strip()
38
+ ticker = yf.Ticker(symbol)
39
+
40
+ info = ticker.info
41
+ if not info or info.get('regularMarketPrice') is None:
42
+ raise KeyError(f"Stock symbol '{symbol}' not found or invalid")
43
+
44
+ return info
45
+
46
+ def get_stock_history(
47
+ self,
48
+ symbol: str,
49
+ period: str = "1mo",
50
+ interval: str = "1d",
51
+ start_date: str | None = None,
52
+ end_date: str | None = None
53
+ )-> Any:
54
+ """
55
+ Gets historical price data for a stock with OHLCV data, dividends, and stock splits.
56
+
57
+ Args:
58
+ symbol: Stock ticker symbol (e.g., 'AAPL', 'GOOGL', 'MSFT')
59
+ period: Time period ('1d', '5d', '1mo', '3mo', '6mo', '1y', '2y', '5y', '10y', 'ytd', 'max')
60
+ interval: Data interval ('1m', '2m', '5m', '15m', '30m', '60m', '90m', '1h', '1d', '5d', '1wk', '1mo', '3mo')
61
+ start_date: Start date in 'YYYY-MM-DD' format (overrides period)
62
+ end_date: End date in 'YYYY-MM-DD' format (used with start_date)
63
+
64
+ Returns:
65
+ Complete DataFrame with Open, High, Low, Close, Volume, Dividends, Stock Splits columns
66
+
67
+ Tags:
68
+ stock, history, ohlcv, price-data, time-series, important
69
+ """
70
+ if not symbol:
71
+ raise ValueError("Stock symbol cannot be empty")
72
+
73
+ symbol = symbol.upper().strip()
74
+ ticker = yf.Ticker(symbol)
75
+
76
+ return ticker.history(period=period, interval=interval, start=start_date, end=end_date)
77
+
78
+ def get_stock_news(self, symbol: str, limit: int = 10)-> list[Any]:
79
+ """
80
+ Gets latest news articles for a stock from Yahoo Finance.
81
+
82
+ Args:
83
+ symbol: Stock ticker symbol (e.g., 'AAPL', 'GOOGL', 'MSFT')
84
+ limit: Maximum number of articles to return (1-50). Defaults to 10
85
+
86
+ Returns:
87
+ Raw list of news articles from Yahoo Finance
88
+
89
+ Tags:
90
+ stock, news, articles, sentiment, important
91
+ """
92
+ if not symbol:
93
+ raise ValueError("Stock symbol cannot be empty")
94
+
95
+ symbol = symbol.upper().strip()
96
+ ticker = yf.Ticker(symbol)
97
+
98
+ news = ticker.news
99
+ return news[:limit] if news else []
100
+
101
+ def get_financial_statements(self, symbol: str, statement_type: str = "income") -> dict:
102
+ """
103
+ Gets financial statements for a stock from Yahoo Finance.
104
+
105
+ Args:
106
+ symbol: Stock ticker symbol (e.g., 'AAPL', 'GOOGL', 'MSFT')
107
+ statement_type: Type of statement ('income', 'balance', 'cashflow', 'earnings'). Defaults to 'income'
108
+
109
+ Returns:
110
+ Dictionary with financial statement data
111
+
112
+ Tags:
113
+ stock, financial-statements, earnings, important
114
+ """
115
+ if not symbol:
116
+ raise ValueError("Stock symbol cannot be empty")
117
+
118
+ symbol = symbol.upper().strip()
119
+ ticker = yf.Ticker(symbol)
120
+
121
+ if statement_type == "income":
122
+ df = ticker.income_stmt
123
+ elif statement_type == "balance":
124
+ df = ticker.balance_sheet
125
+ elif statement_type == "cashflow":
126
+ df = ticker.cashflow
127
+ elif statement_type == "earnings":
128
+ df = ticker.earnings
129
+ else:
130
+ df = ticker.income_stmt
131
+
132
+ try:
133
+ return df.to_dict('dict') # type: ignore
134
+ except:
135
+ return {}
136
+
137
+ def get_stock_recommendations(self, symbol: str, rec_type: str = "recommendations") -> list[dict]:
138
+ """
139
+ Gets analyst recommendations for a stock from Yahoo Finance.
140
+
141
+ Args:
142
+ symbol: Stock ticker symbol (e.g., 'AAPL', 'GOOGL', 'MSFT')
143
+ rec_type: Type of recommendation data ('recommendations', 'upgrades_downgrades'). Defaults to 'recommendations'
144
+
145
+ Returns:
146
+ List of dictionaries with analyst recommendation data
147
+
148
+ Tags:
149
+ stock, recommendations, analyst-ratings, important
150
+ """
151
+ if not symbol:
152
+ raise ValueError("Stock symbol cannot be empty")
153
+
154
+ symbol = symbol.upper().strip()
155
+ ticker = yf.Ticker(symbol)
156
+
157
+ if rec_type == "upgrades_downgrades":
158
+ df = ticker.upgrades_downgrades
159
+ else:
160
+ df = ticker.recommendations
161
+
162
+ try:
163
+ return df.to_dict('records') # type: ignore
164
+ except:
165
+ return []
166
+
167
+ def search(self, query: str, max_results: int = 10, news_count: int = 5, include_research: bool = False) -> dict[str, Any]:
168
+ """
169
+ Search Yahoo Finance for quotes, news, and research using yfinance Search.
170
+
171
+ Args:
172
+ query: Search query (company name, ticker symbol, or keyword)
173
+ max_results: Maximum number of quote results to return. Defaults to 10
174
+ news_count: Number of news articles to return. Defaults to 5
175
+ include_research: Whether to include research data. Defaults to False
176
+
177
+ Returns:
178
+ Dictionary containing quotes, news, and optionally research data
179
+
180
+ Tags:
181
+ search, quotes, news, research, important
182
+ """
183
+ if not query:
184
+ raise ValueError("Search query cannot be empty")
185
+
186
+ search = yf.Search(query, max_results=max_results, news_count=news_count, include_research=include_research)
187
+
188
+ result = {}
189
+ for attr in dir(search):
190
+ if not attr.startswith('_'):
191
+ try:
192
+ value = getattr(search, attr)
193
+ if not callable(value):
194
+ result[attr] = value
195
+ except:
196
+ continue
197
+
198
+ return result
199
+
200
+ def lookup_ticker(self, query: str, lookup_type: str = "all", count: int = 25) -> list[dict]:
201
+ """
202
+ Look up ticker symbols by type using yfinance Lookup.
203
+
204
+ Args:
205
+ query: Search query for ticker lookup
206
+ lookup_type: Type of lookup ('all', 'stock', 'mutualfund', 'etf', 'index', 'future', 'currency', 'cryptocurrency'). Defaults to 'all'
207
+ count: Maximum number of results to return. Defaults to 25
208
+
209
+ Returns:
210
+ List of dictionaries with ticker lookup results
211
+
212
+ Tags:
213
+ lookup, ticker, symbols, important
214
+ """
215
+ if not query:
216
+ raise ValueError("Lookup query cannot be empty")
217
+
218
+ try:
219
+ lookup = yf.Lookup(query)
220
+
221
+ if lookup_type == "stock":
222
+ results = lookup.get_stock(count=count)
223
+ elif lookup_type == "mutualfund":
224
+ results = lookup.get_mutualfund(count=count)
225
+ elif lookup_type == "etf":
226
+ results = lookup.get_etf(count=count)
227
+ elif lookup_type == "index":
228
+ results = lookup.get_index(count=count)
229
+ elif lookup_type == "future":
230
+ results = lookup.get_future(count=count)
231
+ elif lookup_type == "currency":
232
+ results = lookup.get_currency(count=count)
233
+ elif lookup_type == "cryptocurrency":
234
+ results = lookup.get_cryptocurrency(count=count)
235
+ else: # default to 'all'
236
+ results = lookup.get_all(count=count)
237
+
238
+ try:
239
+ return results.to_dict('records') # type: ignore
240
+ except:
241
+ return []
242
+
243
+ except Exception as e:
244
+ return [{
245
+ "query": query,
246
+ "error": f"Lookup failed: {str(e)}"
247
+ }]
248
+
249
+ def list_tools(self):
250
+ return [
251
+ self.get_stock_info,
252
+ self.get_stock_history,
253
+ self.get_stock_news,
254
+ self.get_financial_statements,
255
+ self.get_stock_recommendations,
256
+ self.search,
257
+ self.lookup_ticker,
258
+ ]