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.
- universal_mcp/applications/ahrefs/README.md +3 -3
- universal_mcp/applications/airtable/README.md +3 -3
- universal_mcp/applications/asana/README.md +3 -3
- universal_mcp/applications/aws_s3/README.md +29 -0
- universal_mcp/applications/bill/README.md +249 -0
- universal_mcp/applications/calendly/README.md +45 -45
- universal_mcp/applications/canva/README.md +35 -35
- universal_mcp/applications/clickup/README.md +4 -4
- universal_mcp/applications/contentful/README.md +1 -2
- universal_mcp/applications/crustdata/README.md +3 -3
- universal_mcp/applications/domain_checker/README.md +2 -2
- universal_mcp/applications/e2b/README.md +4 -4
- universal_mcp/applications/elevenlabs/README.md +3 -77
- universal_mcp/applications/exa/README.md +7 -7
- universal_mcp/applications/falai/README.md +13 -12
- universal_mcp/applications/figma/README.md +3 -3
- universal_mcp/applications/file_system/README.md +13 -0
- universal_mcp/applications/firecrawl/README.md +9 -9
- universal_mcp/applications/fireflies/README.md +14 -14
- universal_mcp/applications/fireflies/app.py +109 -1
- universal_mcp/applications/fpl/README.md +12 -12
- universal_mcp/applications/fpl/app.py +5 -5
- universal_mcp/applications/github/README.md +10 -10
- universal_mcp/applications/google_calendar/README.md +10 -10
- universal_mcp/applications/google_docs/README.md +14 -14
- universal_mcp/applications/google_drive/README.md +54 -57
- universal_mcp/applications/google_drive/app.py +22 -10
- universal_mcp/applications/google_gemini/README.md +3 -14
- universal_mcp/applications/google_mail/README.md +20 -20
- universal_mcp/applications/google_searchconsole/README.md +10 -10
- universal_mcp/applications/google_sheet/README.md +25 -25
- universal_mcp/applications/google_sheet/app.py +131 -131
- universal_mcp/applications/http_tools/README.md +5 -5
- universal_mcp/applications/hubspot/__init__.py +1 -1
- universal_mcp/applications/hubspot/api_segments/__init__.py +0 -0
- universal_mcp/applications/hubspot/api_segments/api_segment_base.py +25 -0
- universal_mcp/applications/hubspot/api_segments/crm_api.py +7337 -0
- universal_mcp/applications/hubspot/api_segments/marketing_api.py +1467 -0
- universal_mcp/applications/hubspot/app.py +74 -146
- universal_mcp/applications/klaviyo/README.md +0 -36
- universal_mcp/applications/linkedin/README.md +4 -4
- universal_mcp/applications/mailchimp/README.md +3 -3
- universal_mcp/applications/ms_teams/README.md +31 -31
- universal_mcp/applications/neon/README.md +3 -3
- universal_mcp/applications/openai/README.md +18 -17
- universal_mcp/applications/outlook/README.md +9 -9
- universal_mcp/applications/perplexity/README.md +4 -4
- universal_mcp/applications/posthog/README.md +128 -127
- universal_mcp/applications/reddit/README.md +21 -124
- universal_mcp/applications/resend/README.md +29 -29
- universal_mcp/applications/scraper/README.md +4 -4
- universal_mcp/applications/semrush/README.md +3 -0
- universal_mcp/applications/serpapi/README.md +3 -3
- universal_mcp/applications/sharepoint/README.md +17 -0
- universal_mcp/applications/shortcut/README.md +3 -3
- universal_mcp/applications/slack/README.md +23 -0
- universal_mcp/applications/spotify/README.md +3 -3
- universal_mcp/applications/supabase/README.md +3 -3
- universal_mcp/applications/tavily/README.md +4 -4
- universal_mcp/applications/twilio/README.md +15 -0
- universal_mcp/applications/twitter/README.md +92 -89
- universal_mcp/applications/twitter/app.py +11 -11
- universal_mcp/applications/unipile/README.md +17 -17
- universal_mcp/applications/whatsapp/README.md +12 -12
- universal_mcp/applications/whatsapp/app.py +13 -13
- universal_mcp/applications/whatsapp_business/README.md +23 -23
- universal_mcp/applications/yahoo_finance/README.md +17 -0
- universal_mcp/applications/yahoo_finance/__init__.py +1 -0
- universal_mcp/applications/yahoo_finance/app.py +258 -0
- universal_mcp/applications/youtube/README.md +46 -46
- universal_mcp/applications/youtube/app.py +7 -1
- universal_mcp/applications/zenquotes/README.md +1 -1
- {universal_mcp_applications-0.1.18.dist-info → universal_mcp_applications-0.1.20.dist-info}/METADATA +3 -89
- {universal_mcp_applications-0.1.18.dist-info → universal_mcp_applications-0.1.20.dist-info}/RECORD +76 -71
- universal_mcp/applications/replicate/README.md +0 -18
- universal_mcp/applications/replicate/__init__.py +0 -1
- universal_mcp/applications/replicate/app.py +0 -493
- {universal_mcp_applications-0.1.18.dist-info → universal_mcp_applications-0.1.20.dist-info}/WHEEL +0 -0
- {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` |
|
|
13
|
-
| `list_chat_messages` |
|
|
14
|
-
| `send_chat_message` | Sends a message
|
|
15
|
-
| `retrieve_chat` | Retrieves a
|
|
16
|
-
| `list_all_messages` |
|
|
17
|
-
| `list_all_accounts` |
|
|
18
|
-
| `
|
|
19
|
-
| `
|
|
20
|
-
| `retrieve_own_profile` | Retrieves the profile
|
|
21
|
-
| `
|
|
22
|
-
| `retrieve_post` |
|
|
23
|
-
| `list_post_comments` |
|
|
24
|
-
| `create_post` |
|
|
25
|
-
| `
|
|
26
|
-
| `create_post_comment` |
|
|
27
|
-
| `
|
|
28
|
-
| `search` | Performs a comprehensive search
|
|
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` |
|
|
13
|
-
| `
|
|
14
|
-
| `
|
|
15
|
-
| `
|
|
16
|
-
| `
|
|
17
|
-
| `
|
|
18
|
-
| `
|
|
19
|
-
| `get_message_context` |
|
|
20
|
-
| `
|
|
21
|
-
| `
|
|
22
|
-
| `
|
|
23
|
-
| `
|
|
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
|
-
| `
|
|
13
|
-
| `
|
|
14
|
-
| `get_business_account` |
|
|
15
|
-
| `get_commerce_settings` | Retrieves the commerce settings
|
|
16
|
-
| `
|
|
17
|
-
| `
|
|
18
|
-
| `
|
|
19
|
-
| `get_business_phone_number` | Retrieves details for a specific
|
|
20
|
-
| `
|
|
21
|
-
| `
|
|
22
|
-
| `
|
|
23
|
-
| `
|
|
24
|
-
| `create_qr_code` |
|
|
25
|
-
| `
|
|
26
|
-
| `
|
|
27
|
-
| `
|
|
28
|
-
| `create_message_template` | Creates a new
|
|
29
|
-
| `
|
|
30
|
-
| `get_subscribed_apps` | Retrieves a list of
|
|
31
|
-
| `
|
|
32
|
-
| `
|
|
33
|
-
| `
|
|
34
|
-
| `get_all_owned_wabas` | Retrieves a list of WhatsApp Business Accounts owned by
|
|
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
|
+
]
|